假设我们有以下数据框:
df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar',
'foo', 'bar', 'foo', 'foo'],
'B' : ['one', 'one', 'two', 'three',
'two', 'two', 'one', 'three'],
'C' : randn(8), 'D' : randn(8)})
如下图所示:
> df
A B C D
0 foo one 0.846192 0.478651
1 bar one 2.352421 0.141416
2 foo two -1.413699 -0.577435
3 bar three 0.569572 -0.508984
4 foo two -1.384092 0.659098
5 bar two 0.845167 -0.381740
6 foo one 3.355336 -0.791471
7 foo three 0.303303 0.452966
然后我执行以下操作:
df2 = df
df = df[df['C']>0]
如果你现在看df
and df2
你会看到df2
持有original数据,而df
已更新为仅保留值C
大于 0。
我认为 Pandas 不应该在像这样的作业中复制df2 = df
并且它只会使用以下任一方式进行复制:
df2 = df.copy(deep=True)
df2 = copy.deepcopy(df)
那上面发生了什么?做过df2 = df
复印吗?我认为答案是no,所以一定是df = df[df['C']>0]
制作了一份副本,我想,如果我没有的话df2=df
上面,会有一个副本没有任何参考让它浮现在记忆中。那是对的吗?
Note: 我读完了返回视图与副本 http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy我想知道是否存在以下情况:
每当索引操作涉及标签数组或布尔向量时,结果将是一个副本。
解释了这种行为。