我试图通过通过索引选择
来设置数据框中的列值。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)