Python 熊猫中的重新分配:复制还是查看?
假设我们有以下数据帧:Python 熊猫中的重新分配:复制还是查看?,python,pandas,Python,Pandas,假设我们有以下数据帧: df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'foo'], 'B' : ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three'],
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
大于0的值
我认为熊猫不应该在类似df2=df
这样的作业中复制,它只会在以下两种情况下复制:
df2=df.copy(deep=True)
df2=copy.deepcopy(df)
df2=df
复制了吗?我假设答案是否定的,所以一定是复制了一个副本的df=df[df['C']>0]
,并且我假设,如果我没有上面的df2=df
,那么就会有一个副本,而没有任何引用在内存中浮动。对吗
注意:我通读了一遍,不知道以下内容:
df2 = df
df = df[df['C']>0]
每当索引操作涉及标签数组或布尔向量时,结果将是一个副本
解释了这种行为 不是因为
df2
正在制作副本,而是df=df[df['C']>0]
正在返回副本
只要打印出ID,您就会看到:
print id(df)
df2 = df
print id(df2)
df = df[df['C'] > 0]
print id(df)
谢谢@acushner我已经看过了,但是找不到我问题的答案。仅供参考,只有当它是一个数据类型时,你才能看到它(即使是这样,也不能保证;取决于你是如何切片的)。谢谢,我更新了OP。我想垃圾收集会处理没有引用的副本。对吗?肯定会的。我的意思是,如果没有引用,它也会去掉原作。