关于链式索引以及特定操作是进行查看还是复制,StackOverflow上存在很多问题。 (例如,here或here)。我仍然没有完全理解它,但令人惊讶的部分是官方文档说“没人知道”。 (!?!??)这是文档中的一个例子;你能告诉我他们是否真的这么说,或者他们只是在轻浮吗?
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
真的?对于那个具体的例子,“没人知道”并且这是非确定性的,这是真的吗?在两个不同的数据帧上,这真的会有不同的表现吗?规则真的很复杂吗?或者这个人是否意味着有一个确定的答案,但只是大多数人都不知道它?
答案 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