我收到以下警告:
SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame
在以下行:
df3[['prod_tags_0', 'prod_tags_1', 'prod_tags_2', 'prod_tags_3']].fillna(0, inplace=True)
我如何解决此警告?
答案 0 :(得分:6)
df3[['prod_tags_0', 'prod_tags_1', 'prod_tags_2', 'prod_tags_3']]
创建新数据框,该数据框是df3
的子集。由于您使用的是inplace=True
,因此您会收到上述警告,因为它会尝试修改新的数据框,您不会在其中保留参考(我怀疑如果您打印{ {1}}你会看到这条线实际上没有效果。)
我执行以下操作之一:
在不使用df3
的情况下将新创建的数据框重新分配回df3
:
inplace=True
或稍微偏好的方式(至少在我看来):
将要修改的列作为字典传递df3[['prod_tags_0', 'prod_tags_1', 'prod_tags_2', 'prod_tags_3']] = \
df3[['prod_tags_0', 'prod_tags_1', 'prod_tags_2', 'prod_tags_3']].fillna(0)
。键是列'名称和值是fillna
应在每列中替换的内容:
NaN
在此示例中,您可以使用字典理解:
df3.fillna({'prod_tags_0': 0, 'prod_tags_1': 0,
'prod_tags_2': 0, 'prod_tags_3': 0}, inplace=True)
答案 1 :(得分:0)
这里要澄清两个答案:两个都是正确的。使用df[["column"]]
语法(请注意双括号)的索引确实会导致inplace=True
无效,因为它正在对数据帧的副本进行操作,但是使用df.loc["column"]
-或为此{ {1}}-使用inplace标志将按预期成功,尽管发出警告 ,但我相信这是一个错误。
很显然,DeepSpace的答案(尤其是关于在字典上使用而不是在DataFrame的某个切片上使用fillna()的答案)更为优雅,但是没有理由不能使用df["column"]
或{{ 1}}。
答案 2 :(得分:0)
dataframe
将新创建的df3
重新分配回inplace=True
:尝试一下:
df3[['prod_tags_0', 'prod_tags_1', 'prod_tags_2', 'prod_tags_3']] = \
df3[['prod_tags_0', 'prod_tags_1', 'prod_tags_2', 'prod_tags_3']].fillna(0)