【问题标题】:Pandas: Subindexing dataframes: Copies vs views熊猫:子索引数据框:副本与视图
【发布时间】:2013-07-31 09:30:14
【问题描述】:

假设我有一个数据框

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 吗?如果是这样,如果我尝试在此视图中修改数据会发生什么? Pandas 是否提供任何形式的copy-on-write 机制?

【问题讨论】:

  • 所以当我做 bar.loc[:, ['a', 'b']] 它返回一个副本,但是当我做 bar.loc[:, 'a'] 它返回一个查看?

标签: python pandas chained-assignment


【解决方案1】:

您的答案在 pandas 文档中:returning-a-view-versus-a-copy

只要涉及到标签数组或布尔向量 在索引操作中,结果将是一个副本。 使用单标签/标量索引和切片, 例如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

【讨论】:

  • 所以当我做 bar.loc[:, ['a', 'b']] 它返回一个副本,但是当我做 bar.loc[:, 'a'] 它返回一个查看?
  • bar.loc[:, 'a'] 就像一个切片,返回一个视图,而 bar.loc[:, ['a', 'b']] 使用列表返回副本的索引。请注意, bar.loc[:, ['a']] 也会返回一个副本。
  • bar['a'] 怎么样?是视图还是副本?
  • @davidshinn 突出显示的引用是否仍在您链接的文档中?我找不到!
  • 自原回复后已修改(引用在0.13版本):pandas.pydata.org/pandas-docs/version/0.13/…
猜你喜欢
  • 2015-02-06
  • 2022-07-10
  • 2015-01-25
  • 1970-01-01
  • 1970-01-01
  • 2016-08-24
相关资源
最近更新 更多