我有一个数据帧:
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