在pandas中设置切片值的正确方法

Bri*_*tow 39 python pandas chained-assignment

我有一个pandas数据帧:数据.它有列["名称","A","B"]

我想做(和工作)的是:

d2 = data[data['name'] == 'fred'] #This gives me multiple rows
d2['A'] = 0
Run Code Online (Sandbox Code Playgroud)

这会将fred行上的A列设置为0.我也做了:

indexes = d2.index
data['A'][indexes] = 0
Run Code Online (Sandbox Code Playgroud)

但是,两人都给了我同样的警告:

/Users/brianp/work/cyan/venv/lib/python2.7/site-packages/pandas/core/indexing.py:128: 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
Run Code Online (Sandbox Code Playgroud)

大熊猫是怎么想让我这样做的?

And*_*ieh 69

这是熊猫非常普遍的警告.这意味着您正在写入复制片,而不是原始数据,因此由于链接分配混乱,它可能不适用于原始列.请阅读这篇文章.它对此进行了详细的讨论SettingWithCopyWarning.在你的情况下,我认为你可以尝试

data.loc[data['name'] == 'fred', 'A'] = 0
Run Code Online (Sandbox Code Playgroud)

  • 很多人都说这是正确的方法,这也是我的方式.但是,有时我会收到警告,说我在副本上设置值,并建议我在使用时使用.loc.有谁经历过同样的事情? (6认同)
  • @CalvinKu,是的!在做它要求我做的事情时,我得到同样的警告!国际海事组织,这是一个模棱两可的行为,应该作为一个错误,但熊猫人们已经厌倦了听到它,所以我没有信心它将被解决......这样的耻辱...特别是来自R. (6认同)
  • 我正要发布相同的内容。逻辑上的“单线”优于不必要的行。 (2认同)
  • 有趣的是,有时我会得到这个,无论我如何重构它都不会消失.但是当我再次运行相同的代码时,警告就消失了.我猜测这部分大熊猫的实现并不是非常强大,所以你偶尔会看到像这样的误报.但是,让我感到困惑的是,它似乎并没有发生在某些人身上,所以他们确信这是你的代码错了......哈哈 (2认同)
  • @CalvinKu,当您分配给的数据帧是另一个数据帧的视图时,就会发生这种情况。例如考虑代码: {a = pd.DataFrame({'x':[1],'y':[1]}); b = a[['x']]; b.loc[:,'x'] = 0 }. 在这里你会得到一个带有复制警告的设置,通知你已经更改了 b 的值,但没有更改 a 的值。 (2认同)