选择数据框的一部分以获取视图,而不是副本

时间:2019-06-28 15:08:31

标签: python pandas

如何选择原始变量“ frame”的一部分,以便更改“ frame2”也将更改“ frame”?以下无效。

import pandas as pd
frame = pd.DataFrame([[1,2,3],[1,5,6], [7,8,9]])
frame2 = frame.loc[frame.loc[:,0] == 1]
frame2.loc[:,1] = -99

谢谢!

1 个答案:

答案 0 :(得分:2)

第一个重要方面是loc(并扩展为ilocatiat)将始终返回副本。

如果要查看视图,则必须通过frame__getitem__编制索引。现在,即使这样也不能保证返回视图或副本-这是实现细节,而且不容易分辨。

在以下索引操作之间,

frame2 = frame[frame.iloc[:,0] == 1]
frame3 = frame[frame > 0]
frame4 = frame2[[0, 1]]

frame2._is_view
# False
frame3._is_view
# True
frame4._is_view
# False

只有frame3是一个视图。细节还取决于dtypes和其他因素(例如切片的形状),但这是一个明显的区别。

尽管frame3是一个视图,但对其进行的修改可能行不通,但它们永远不会导致对frame的更改。开发人员已经进行了大量检查(most notably the SettingWithCopyWarning),以防止由于修改视图而产生意外副作用。

frame3.iloc[:, 1] = 12345
frame3
   0      1  2
0  1  12345  3
1  1  12345  6
2  7  12345  9

frame
   0  1  2
0  1  2  3
1  1  5  6
2  7  8  9

TLDR;请寻找另一种方法来做您想做的事。