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。我想垃圾收集会处理没有引用的副本。对吗?肯定会的。我的意思是,如果没有引用,它也会去掉原作。