簡體   English   中英

Pandas DataFrame:SettingWithCopyWarning:嘗試在DataFrame的切片副本上設置值

[英]Pandas DataFrame: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame

我知道有很多關於這個警告的帖子,但我無法找到解決方案。 這是我的代碼:

df.loc[:, 'my_col'] = df.loc[:, 'my_col'].astype(int)
#df.loc[:, 'my_col'] = df.loc[:, 'my_col'].astype(int).copy()
#df.loc[:, 'my_col'] = df['my_col'].astype(int)

它產生警告:

SettingWithCopyWarning:嘗試在DataFrame的切片副本上設置值。 嘗試使用.loc [row_indexer,col_indexer] = value

即使我按照建議更改了代碼,我仍然會收到此警告? 我需要做的就是轉換一列的數據類型。

**備注:**最初該列的類型為float,具有一位小數(例如:4711.0)。 因此我將其更改為整數(4711)然后更改為字符串('4711') - 只是為了刪除小數。

感謝您的幫助!

更新:該警告對過濾之前完成的原始數據的過濾產生了副作用。 我錯過了DataFrame.copy()。 使用副本代替,解決了問題!

df = df[df['my_col'].notnull()].copy()
df.loc[:, 'my_col'] = df['my_col'].astype(int).astype(str)
#df['my_col'] = df['my_col'].astype(int).astype(str) # works too!

我認為需要copy並省略選擇列的loc

df = df[df['my_col'].notnull()].copy()
df['my_col'] = df['my_col'].astype(int).astype(str)

說明

如果稍后修改df值,您會發現修改不會傳播回原始數據( df ),並且Pandas會發出警告。

另一種方法是禁用鏈式賦值,它可以在您的代碼上運行, 而無需創建副本

# disable chained assignments
pd.options.mode.chained_assignment = None 

如果需要更改單個列的數據類型,則可以更直接地處理該列:

df['my_col'] = df['my_col'].astype(int)

或者使用.assign

df = df.assign(my_col=lambda d: d['my_col'].astype(int))

如果您只需要轉換一次,並且不希望在該范圍之外更改您的df ,則.assign非常有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM