链式分配-接收SettingWithCopyWarning,但仍在更改原始df



我有一个数据帧:

jb = pd.DataFrame([ ['No', 75, 2.0], ['Blofeld', 140, 1.9], ['Chiffre', 114, 1.7]  ],
index=['b1', 'b5', 'b21'], columns=['Name', 'Weight', 'Height'])

然后,如果我按照下面的方式进行链式赋值,它不会改变jb中的原始值。它还将触发CCD_ 2。

jb[jb.Weight==75]['Height'] = 9

但如果我切换链式赋值的顺序,它会改变jb中的原始值,但仍然会触发SettingWithCopyWarning

jb['Height'][jb.Weight==75] = 9

所以第二个代码仍然在生成副本,但为什么它最终会修改原始jb

您不应该尝试执行您所称的链式赋值。Pandas文档指出,未指定您获得的是视图(并更改原始值(还是副本(并没有(。AFAIK,它取决于实现细节和Pandas优化代码的内部。

话虽如此,观察到的行为并不奇怪。在Pandas DataFrame中,数据按列存储在numpy数组中。因此,当您按列访问第一个(第二个代码(时,Pandas可以很容易地将底层numpy数组作为Series进行访问。但当你逐行访问(你的第一个代码(时,Pandas必须构建一个新的系列,并且只给你一份原始数据的副本。

然而,唯一可靠的方法是使用loc:

jb.loc[jb.Weight == 75, 'Height'] = 9

相关内容

最新更新