我收到以下警告:
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)
我如何解决此警告?
最佳答案
df3[['prod_tags_0', 'prod_tags_1', 'prod_tags_2', 'prod_tags_3']]
创建一个新的数据帧,该数据帧是df3
的子集。由于您使用的是inplace=True
,因此会收到上述警告,因为它尝试就地修改新的数据框,因此您不会对其进行引用(而且我怀疑如果您要打印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)
在此示例中,您可以使用字典理解:
import pandas as pd
import numpy as np
df = pd.DataFrame({'prod_tags_0': [np.nan], 'prod_tags_1': [np.nan],
'prod_tags_2': [np.nan]})
print(df)
>> prod_tags_0 prod_tags_1 prod_tags_2
0 NaN NaN NaN
df.fillna({'prod_tags_' + str(i): 0 for i in range(2)}, inplace=True)
print(df)
>> prod_tags_0 prod_tags_1 prod_tags_2
0 0.0 0.0 NaN
关于python - 正在尝试从DataFrame的切片副本上设置一个值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41207160/