关于链式索引以及特定操作是进行查看还是复制,StackOverflow上有很多问题.(例如,这里或这里).我仍然没有完全理解它,但令人惊讶的部分是官方文档说"没人知道".(!?!??)这是文档中的一个例子; 你能告诉我他们是否真的这么说,或者他们只是在轻浮吗?
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
Run Code Online (Sandbox Code Playgroud)
真的吗?对于那个具体的例子,"没人知道"并且这是非确定性的,这是真的吗?在两个不同的数据帧上,这真的会有不同的表现吗?规则真的很复杂吗?或者这个人是否意味着有一个明确的答案,但只是大多数人都没有意识到这一点?
我想我可以展示一些东西来澄清你的情况,在你的例子中,最初它将是一个视图,但是一旦你尝试通过添加一个列来修改它就会变成一个副本.您可以通过查看属性来测试._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
Run Code Online (Sandbox Code Playgroud)
所以在这里我们可以看到最初a是原始df的原始子部分的视图,但是一旦你向它添加一个列,这不再是真的,我们可以看到原始的df没有被修改.
以下是我认为您可能错过的核心文档:
\n\n\n\n\n除了简单的情况之外,\xe2\x80\x99s 很难预测它是否会返回视图或副本(这取决于数组的内存布局,pandas对此不做保证)
\n
所以有一个底层的 numpy 数组具有某种内存布局。pandas不关心拥有任何相关知识。除此之外,我没有太彻底地阅读文档,但我认为如果您确实想要设置值,他们应该采取某种方法。
\n