我知道有很多关于此警告的帖子,但我无法找到解决方案。这是我的代码:
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:尝试在a的副本上设置值 从DataFrame切片。尝试使用.loc [row_indexer,col_indexer] = 代替值
即使我按照建议更改了代码,我仍然会收到此警告?我需要做的就是转换一列的数据类型。
**备注:**最初该列的类型为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!
答案 0 :(得分:9)
我认为需要copy
并省略loc
选择列:
df = df[df['my_col'].notnull()].copy()
df['my_col'] = df['my_col'].astype(int).astype(str)
<强>解释强>:
如果稍后修改df
中的值,您会发现修改不会传播回原始数据(df
),并且Pandas会发出警告。
答案 1 :(得分:5)
另一种方法是禁用链式分配,这对您的代码起作用而无需创建副本:
# disable chained assignments
pd.options.mode.chained_assignment = None
答案 2 :(得分:2)
如果您需要更改单个列的数据类型,则可以更直接地处理该列:
df['my_col'] = df['my_col'].astype(int)
或使用.assign
:
df = df.assign(my_col=lambda d: d['my_col'].astype(int))
如果您只需要转换一次,并且不想更改该范围之外的.assign
,则df
非常有用。