【发布时间】:2018-09-18 14:02:35
【问题描述】:
我知道有很多关于此警告的帖子,但我找不到解决我的情况的方法。这是我的代码:
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] = 取而代之的价值
即使我按照建议更改了代码,我仍然收到此警告?我需要做的就是转换一列的数据类型。
**备注:**最初该列是具有一位小数的浮点类型(例如: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!
【问题讨论】:
-
这个错误有点混乱,显然问题是
df.loc[:, 'my_col'] = df.loc[:, 'my_col'].astype(int)之前的代码行 -
前一行来自上周的my question:
df = df[df['my_col'].notnull()] -
显然问题出在过滤上,需要
df = df[df['col'] > 10].copy() -
那么
df = df[df['my_col'].notnull()].copy()工作怎么样? -
@jezrael 你是我今天的英雄。就是这样!