settingWithCopyWarning通过索引设置pandas

时间:2016-12-21 19:32:25

标签: python pandas indexing

我试图通过索引选择来设置数据框中列的值。

myindex = (df['city']==old_name) & (df['dt'] >= startDate) & (df['dt'] < endDate)
new_name = 'Boston2
df['proxyCity'].ix[myindex ] = new_name

在上面,我想在Boston2列中为myindex

中的条件指定值proxyCity
C:\Users\blah\Anaconda3\lib\site-packages\pandas\core\indexing.py:132: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
  self._setitem_with_indexer(indexer, value)

在不引入文档中所述问题的情况下,做我想做的事情的正确方法是什么。

此链接using pandas to select rows conditional on multiple equivalencies中的答案似乎是按照我实施的方式进行的。

我不确定这样做的正确方法是什么。

2 个答案:

答案 0 :(得分:9)

要避免双重索引,请更改

df['proxyCity'].ix[myindex ] = new_name

df.loc[myindex, 'proxyCity'] = new_name

效率更高(__getitem__函数调用次数更少),在大多数情况下,会消除SettingWithCopyWarning

但请注意,如果df是另一个DataFrame的子DataFrame,则可能会发出SettingWithCopyWarning 即使使用df.loc[...] = new_name。在此,Pandas警告说修改df不会影响其他DataFrame。 如果这不是您的意图,则可以安全地忽略SettingWithCopyWarning。如何让SettingWithCopyWarning看到this post

答案 1 :(得分:0)

您可以使用mask

mask = (df.city == old_name) & (df.dt >= startDate) & (df.dt < endDate)
new_name = 'Boston2
df.loc[:, 'proxyCity'] = df.proxyCity.mask(mask, new_name)
# Or
df.proxyCity.mask(mask, new_name, inplace=True)