0

我有一个数据框:

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

然后,如果我按如下方式进行链式分配,它不会更改jb. 而且还会触发SettingWithCopyWarning

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

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

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

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

4

1 回答 1

1

您不应该尝试执行所谓的链式分配。Pandas 文档指出,未指定您是否获得视图(并更改原始值)或副本(而不是)。AFAIK,它取决于实现细节和 Pandas 优化代码的内部结构。

话虽如此,观察到的行为并不奇怪。在 Pandas DataFrame 中,数据按列存储在 numpy 数组中。因此,当您首先按列访问(您的第二个代码)时,Pandas 可以轻松地让您访问底层 numpy 数组作为一个系列。但是当您首先按行访问(您的第一个代码)时,Pandas 必须构建一个新系列,并且只给您原始数据的副本。

尽管如此,唯一可靠的方法是使用loc

jb.loc[jb.Weight == 75, 'Height'] = 9
于 2022-01-20T22:12:04.257 回答