如何选择原始变量“ 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
谢谢!
答案 0 :(得分:2)
第一个重要方面是loc
(并扩展为iloc
,at
和iat
)将始终返回副本。
如果要查看视图,则必须通过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;请寻找另一种方法来做您想做的事。