我有一个非常简单的问题。我想更改pandas数据帧的给定行的给定列中的值。我试着用以下方式做到这一点:
df['column3'].loc[this_date] = val
结果我收到以下警告:
SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame
我对此警告的解释是,通过使用列名称('column3'
)和loc
,我实际上并不访问(参考)数据帧的所需单元格。相反,我创建了一个对象,它是“单元格”对象的副本,然后我尝试更改与此“复制对象”关联的值。
我不明白的是它似乎有效。尽管pandas写信告诉我我尝试修改副本,但我确实修改了原始数据框。
我的问题是如何确保我真正做我想做的事情,以及如何以“正确”的方式做到这一点,以便熊猫不会抱怨?
答案 0 :(得分:2)
获得警告的原因是df
本身是某些其他数据框对象的副本。我猜您有一些原始数据框df_origin
。并且您通过某些操作(例如切片)从df
获得df_origin
。因此df
是df_origin
的副本。然后,您尝试将某个值设置为df
,警告会提示您不会更改df_origin
中的值。
一种解决方案是,如果您不关心df_origin,则使用单个变量指向切片前后的数据框对象。否则,您可以通过pd.set_option('mode.chained_assignment', None)
您设置价值的方式很好,还有以下几种方法:
df.ix[this_date, 'column3] = val
df.loc[this_date, 'column3'] = val
df.at[this_date, 'column3'] = val