在熊猫中重新分配:复制还是查看?

时间:2014-03-20 15:06:34

标签: python pandas

假设我们有以下数据框:

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]

如果您现在查看dfdf2,您会看到df2包含原始数据,而df仅更新为C保持df2 = df大于0的值。

我认为Pandas不应该在像df2 = df.copy(deep=True)这样的作业中复制,并且它只会复制以下任何一个:

  1. df2 = copy.deepcopy(df)
  2. df2 = df
  3. 上面发生了什么? df = df[df['C']>0]制作副本了吗?我认为答案是没有,所以它必须是df2=df制作副本,并且我认为,如果我上面没有{{1}},那么是一个副本没有任何引用浮动在内存中。这是对的吗?

    注意:我通读了Returning a view versus a copy,我想知道以下内容:

      

    每当索引操作中涉及标签数组或布尔向量时,结果都将是副本。

    解释了这种行为。

1 个答案:

答案 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)