2012-06-01 65 views
5

我在修改重複的熊貓DataFrame時遇到了一些麻煩,而且沒有將修改應用於原始DataFrame的重複python熊貓中的DataFrame.apply改變了原始數據幀和重複數據幀

下面是一個例子。說我創建的詞典列表的任意數據框:「A」使用應用

In [67]: d = [{'a':3, 'b':5}, {'a':1, 'b':1}] 

In [68]: d = DataFrame(d) 

In [69]: d 

Out[69]: 
    a b 
0 3 5 
1 1 1 

然後我給你的「d」數據幀變量「e」和適用於一些任意數學列:

In [70]: e = d 

In [71]: e['a'] = e['a'].apply(lambda x: x + 1) 

In [72]: e # duplicate DataFrame 
Out[72]: 
    a b 
0 4 5 
1 2 1 

In [73]: d # original DataFrame, notice the alterations to frame 'e' were also applied 
Out[73]: 
    a b 
0 4 5 
1 2 1 

我已經搜查b:在應用函數顯然既適用於重複數據框「e」和原始數據幀「d」,這是我不能爲我的生活出

問題出現大熊貓的文檔和谷歌因爲這個原因會這樣,但無濟於事。我根本無法理解這裏發生了什麼。

我也嘗試了使用元素操作的數學運算(例如,e['a'] = [i + 1 for i in e['a']]),但問題仍然存在。在我不知道的熊貓DataFrame類型中是否有一個怪癖?我很感謝有人可能提供的任何見解。

回答

11

這不是熊貓特有的問題。在Python,分配永遠不會複製任何東西:

>>> a = [1,2,3] 
>>> b = a 
>>> b[0] = 'WHOA!' 
>>> a 
['WHOA!', 2, 3] 

如果你想有一個新的數據幀,使副本e = d.copy()

編輯:我應該澄清,轉讓到裸露的名字永遠不會複製任何東西。對項目或屬性的分配(例如,a[1] = xa.foo = bar)被轉換爲引擎蓋下的方法調用,並且可以根據對象a是什麼類型進行復制。

+0

就在我以爲我在Python上獲得了不錯的把握時!非常感謝回覆。這是一個很大的幫助。 – MikeGruz

+0

爲什麼不b = a.copy()工作?什麼是周圍的工作.. – Merlin

+0

我不明白你的意思是「爲什麼不工作」。它確實有效。也許你對變量名稱感到困惑?我說'e = d.copy()'是因爲那些是原始問題中使用的名稱。 – BrenBarn