我试图通过索引选择来设置数据框中列的值。
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中的答案似乎是按照我实施的方式进行的。
我不确定这样做的正确方法是什么。
答案 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)