通过索引设置WITHCOPYWARNING PANDAS设置



我试图通过通过索引选择

来设置数据框中的列值。
myindex = (df['city']==old_name) & (df['dt'] >= startDate) & (df['dt'] < endDate)
new_name = 'Boston2
df['proxyCity'].ix[myindex ] = new_name

在上面的情况下,我想在proxyCity列中分配值Boston2,给定MyIndex中的条件

C:UsersblahAnaconda3libsite-packagespandascoreindexing.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)

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

使用pandas在此链接中的答案在多个等效上选择有条件的行似乎是按照我实现的方式来做到的。

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

要避免双重索引,请更改

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

to

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

它更有效(__getitem__函数调用更少),在大多数情况下,将消除SettingWithCopyWarning

请注意,如果df是另一个数据框的子数据框,则可以发射SettingWithCopyWarning即使使用df.loc[...] = new_name。在这里,熊猫警告说,修改df不会影响其他数据框架。如果不是您的意图,则可以安全地忽略SettingWithCopyWarning。有关SettingWithCopyWarning沉默的方法,请参阅此帖子。

您可以使用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)

最新更新