pandas views vs copy:文档说“没人知道”?

时间:2016-08-23 12:58:38

标签: python pandas

关于链式索引以及特定操作是进行查看还是复制,StackOverflow上存在很多问题。 (例如,herehere)。我仍然没有完全理解它,但令人惊讶的部分是官方文档说“没人知道”。 (!?!??)这是文档中的一个例子;你能告诉我他们是否真的这么说,或者他们只是在轻浮吗?

来自http://pandas-docs.github.io/pandas-docs-travis/indexing.html?highlight=view#why-does-assignment-fail-when-using-chained-indexing

def do_something(df):
   foo = df[['bar', 'baz']]  # Is foo a view? A copy? Nobody knows!
   # ... many lines here ...
   foo['quux'] = value       # We don't know whether this will modify df or not!
   return foo

真的?对于那个具体的例子,“没人知道”并且这是非确定性的,这是真的吗?在两个不同的数据帧上,这真的会有不同的表现吗?规则真的很复杂吗?或者这个人是否意味着有一个确定的答案,但只是大多数人都不知道它?

3 个答案:

答案 0 :(得分:5)

我想我可以展示一些内容来澄清你的情况,在你的例子中,最初它将是一个视图,但是一旦你尝试通过添加一个列来修改它就会变成一个副本。您可以通过查看属性._is_view

来测试此问题
In [29]:
df = pd.DataFrame(np.random.randn(5,3), columns=list('abc'))
def doSomething(df):
    a = df[['b','c']]
    print('before ', a._is_view)
    a['d'] = 0
    print('after ', a._is_view)

doSomething(df)
df

before  True
after  False
Out[29]:
          a         b         c
0  0.108790  0.580745  1.820328
1  1.066503 -0.238707 -0.655881
2 -1.320731  2.038194 -0.894984
3 -0.962753 -3.961181  0.109476
4 -1.887774  0.909539  1.318677

所以在这里我们可以看到最初a是原始df的原始子部分的视图,但是一旦你向它添加一列,这就不再是真的了,我们可以看到原来的df是没有修改。

答案 1 :(得分:4)

以下是我认为您可能遗漏的文档的核心内容:

  

除了简单的情况之外,很难预测它是否会返回视图或副本(这取决于数组的内存布局, pandas 无法保证)

所以有一个底层的numpy数组有某种内存布局。 pandas 并不关心对此有任何知识。除此之外我没有彻底阅读文档,但我认为如果你真的想要设置,他们会采用某种方式应该采取值。

答案 2 :(得分:0)

我认为这是一个很好地说明不一致的例子。

我将数据帧子集化,返回一个视图。然后我可以覆盖整个列中的值,但是根据我在语法上的表达方式,我会得到不同的结果。

full_name