pandas:Subindexing数据框:副本与视图

说我有一个数据框

import pandas as pd import numpy as np foo = pd.DataFrame(np.random.random((10,5))) 

我从我的数据的一个子集创build另一个数据框:

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

bar持有foo的这些元素的副本? 有没有什么办法来创build一个数据view呢? 如果是这样,如果我尝试在这个视图中修改数据会发生什么? pandas是否提供任何types的写入时复制机制?

你的答案在于pandas文档: 返回一个视图与一个副本 。

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

在你的例子中, barfoo切片的视图 。 如果你想要一个副本 ,你可以使用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