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

Python 熊猫:子索引数据帧:副本与视图,python,pandas,chained-assignment,Python,Pandas,Chained Assignment,假设我有一个数据帧 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中这些元素的副本?有没有办法创建该数据的视图?如果是这样,如果我尝试修改此视图中的数据会发生什么情况?熊猫提供了某种机制吗?你的答案在熊猫文档中: 每当涉及标签数组或布尔向量时 在索引操作中,结果将是一

假设我有一个数据帧

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
中这些元素的副本?有没有办法创建该数据的
视图
?如果是这样,如果我尝试修改此视图中的数据会发生什么情况?熊猫提供了某种机制吗?

你的答案在熊猫文档中:

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

在您的示例中,
bar
foo
切片的视图。如果您想要复制,可以使用
复制
方法。修改
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

因此,当我执行bar.loc[:,['a','b']]时,它会返回一个副本,但当我执行bar.loc[:,'a']时,它会返回一个视图?bar.loc[:,'a']就像一个切片,它会返回一个视图,而bar.loc[:,['a','b']]则使用列表索引来返回副本。请注意,bar.loc[:,['a']]也会返回一个副本。bar['a']呢?它是视图还是副本?@davidshinn突出显示的报价是否仍在您链接的文档中?我找不到它!自从最初的回复(引用是在版本0.13中)以来,它已经被修改:所以当我执行bar.loc[:,['a','b']]时,它返回一个副本,但是当我执行bar.loc[:,'a']时,它返回一个视图?