假设我们有以下数据框:
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
和df2
,您会看到df2
包含原始数据,而df
仅更新为C
保持df2 = df
大于0的值。
我认为Pandas不应该在像df2 = df.copy(deep=True)
这样的作业中复制,并且它只会复制以下任何一个:
df2 = copy.deepcopy(df)
df2 = df
上面发生了什么? df = df[df['C']>0]
制作副本了吗?我认为答案是没有,所以它必须是df2=df
制作副本,并且我认为,如果我上面没有{{1}},那么是一个副本没有任何引用浮动在内存中。这是对的吗?
注意:我通读了Returning a view versus a copy,我想知道以下内容:
每当索引操作中涉及标签数组或布尔向量时,结果都将是副本。
解释了这种行为。
答案 0 :(得分:6)
不是df2
正在制作副本,而是df = df[df['C'] > 0]
正在返回副本。
只需打印出ID即可,您会看到:
print id(df)
df2 = df
print id(df2)
df = df[df['C'] > 0]
print id(df)