熊猫:子索引数据帧:副本与视图

Ame*_*ina 22 python pandas chained-assignment

说我有一个数据帧

import pandas as pd
import numpy as np
foo = pd.DataFrame(np.random.random((10,5)))
Run Code Online (Sandbox Code Playgroud)

我从我的数据子集创建另一个数据帧:

bar = foo.iloc[3:5,1:4]
Run Code Online (Sandbox Code Playgroud)

确实bar持有这些元素的副本foo?有没有办法创建view这些数据呢?如果是这样,如果我尝试修改此视图中的数据会发生什么?Pandas是否提供任何类型的写时复制机制?

dav*_*inn 30

你的答案在于pandas docs:return-a-view-a-copy.

每当索引操作中涉及标签数组或布尔向量时,结果将是副本.使用单标签/标量索引和切片,例如df.ix [3:6]或df.ix [:,'A'],将返回视图.

在您的示例中,bar是一个切片视图foo.如果你想要一个副本,你可以使用该copy方法.修改bar也会修改foo.pandas似乎没有写入时复制机制.

请参阅下面的代码示例来说明:

In [1]: import pandas as pd
   ...: import numpy as np
   ...: foo = pd.DataFrame(np.random.random((10,5)))
   ...: 

In [2]: pd.__version__
Out[2]: '0.12.0.dev-35312e4'

In [3]: np.__version__
Out[3]: '1.7.1'

In [4]: # DataFrame has copy method
   ...: foo_copy = foo.copy()

In [5]: bar = foo.iloc[3:5,1:4]

In [6]: bar == foo.iloc[3:5,1:4] == foo_copy.iloc[3:5,1:4]
Out[6]: 
      1     2     3
3  True  True  True
4  True  True  True

In [7]: # Changing the view
   ...: bar.ix[3,1] = 5

In [8]: # View and DataFrame still equal
   ...: bar == foo.iloc[3:5,1:4]
Out[8]: 
      1     2     3
3  True  True  True
4  True  True  True

In [9]: # It is now different from a copy of original
   ...: bar == foo_copy.iloc[3:5,1:4]
Out[9]: 
       1     2     3
3  False  True  True
4   True  True  True
Run Code Online (Sandbox Code Playgroud)

  • bar.loc [:,'a']的作用就像一个切片,它返回一个视图,而bar.loc [:, ['a','b']]与使用列表索引的索引返回一个副本。请注意,bar.loc [:, ['a']]也将返回一个副本。 (2认同)
  • 自原始回复(引述的版本为0.13)以来,已对其进行了修订:http://pandas.pydata.org/pandas-docs/version/0.13/indexing.html#indexing-view-versus-copy (2认同)