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

Jos*_*osh 2 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)})
Run Code Online (Sandbox Code Playgroud)

如下所示:

> 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
Run Code Online (Sandbox Code Playgroud)

然后我做以下事情:

df2 = df
df  = df[df['C']>0]
Run Code Online (Sandbox Code Playgroud)

如果您现在查看df并且df2您将看到df2保存原始数据,而df更新为仅保留C大于0 的值.

我认为Pandas不应该在作业中df2 = df制作副本,并且它只会复制以下任何一个:

  1. df2 = df.copy(deep=True)
  2. df2 = copy.deepcopy(df)

那么上面发生了什么?并df2 = df制作副本吗?我认为答案是否定的,所以它一定df = df[df['C']>0]是副本,并且我认为,如果我没有df2=df上面,那么就会有一个副本而没有任何引用浮动在内存中.那是对的吗?

注意:我通过返回视图与副本阅读,我想知道以下内容:

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

解释了这种行为.

acu*_*ner 6

这不是df2制作副本,而是df = df[df['C'] > 0]返回副本.

只需打印出ID即可,您会看到:

print id(df)
df2 = df
print id(df2)
df = df[df['C'] > 0]
print id(df)
Run Code Online (Sandbox Code Playgroud)