2013-07-31 65 views
15

说我有一个数据帧熊猫:Subindexing dataframes:复制VS观点

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

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

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

确实bar持有这些元素的副本从foo?有什么办法可以创建一个view的数据呢?如果是这样,如果我尝试修改这个视图中的数据会发生什么?熊猫是否提供任何种类的copy-on-write机制?

+0

所以当我做bar.loc [:, [ '一', 'B']返回一个拷贝,但是当我做bar.loc [:,'a']它返回一个视图? – Lisa

回答

21

你的答案在于熊猫文档:returning-a-view-versus-a-copy

每当标签的阵列或一个布尔矢量参与转位操作 ,的结果将是一个拷贝。使用单标签/标量索引和切片,例如 df.ix [3:6]或df.ix [:,'A'],将返回视图

在您的例子,barfoo切片的视图。如果你想要一个拷贝,你可以使用copy方法。修改bar也会修改foo。熊猫似乎没有写入时复制机制。

见下面我的代码的例子来说明:

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 
+0

所以当我做bar.loc [:, ['a','b']]它会返回一个副本,但是当我做bar.loc [:,'a']它会返回一个视图? – Lisa

+0

bar.loc [:,'a']就像一个slice,它返回一个视图vs vs.loc [:, ['a','b']],它使用列表索引返回一个副本。请注意,bar.loc [:, ['a']]也会返回一个副本。 – davidshinn

+0

bar ['a']怎么样?这是一个观点还是一个副本? – Lisa