【发布时间】:2014-10-29 14:09:51
【问题描述】:
In[216]: foo = pd.DataFrame({'a':[1,2,3], 'b':[3,4,5]})
In[217]: bar = foo.ix[:1]
In[218]: bar
Out[218]:
a b
0 1 3
1 2 4
按预期创建视图。
In[219]: bar['a'] = 100
In[220]: bar
Out[220]:
a b
0 100 3
1 100 4
In[221]: foo
Out[221]:
a b
0 100 3
1 100 4
2 3 5
如果视图被修改,那么原始数据框 foo 也会被修改。 但是,如果使用 None 完成分配,则似乎制作了一份副本。 任何人都可以阐明正在发生的事情以及背后的逻辑吗?
In[222]: bar['a'] = None
In[223]: bar
Out[223]:
a b
0 None 3
1 None 4
In[224]: foo
Out[224]:
a b
0 100 3
1 100 4
2 3 5
【问题讨论】:
-
我不像 numpy 那样了解 Pandas 的详细信息,但我敢打赌,通过强制列将其 dtype 从
I4更改为 @ 987654325@,您导致它为该列分配一个新数组,然后您写入该新数组而不是与原始 DataFrame 共享的数组。 (我将其发布为评论而不是答案,因为即使我是对的,一个好的答案也应该准确解释这是如何工作的,而不仅仅是挥手致意……) -
@abarnert 这正是幕后发生的事情。继续发帖作为答案。
-
@Jeff:好的,但我仍然认为最好在文档中给出解释的指针,而不是一个 numpy 用户可以猜测 Pandas 可能是如何实现的......跨度>
-
我提出了一个答案。它在很多地方都得到了很好的警告/记录。如果用户不阅读文档,则无能为力。
-
感谢杰夫和其他人!我确实遇到了文档的“返回视图与副本”部分。很抱歉没有详细介绍。现在会这样做:)