2016-11-16 179 views
0

當將新列分配給列表中的一個數據幀時,它將其複製到所有其他數據幀。例如:熊貓DataFrame列表奇怪的行爲

In [219]: a = [pd.DataFrame()]*2 
In [220]: a[0]['a'] = [1,2,3] 
In [221]: a[1] 
Out[221]: 
    a 
0 1 
1 2 
2 3 

這是一個錯誤?我能做些什麼來阻止它?

謝謝!

+1

當您嘗試初始化'[] * N'名單這是已知的行爲。使用'a = [pd.DataFrame()for range in(2)]'來初始化列表。 – Psidom

+0

謝謝Psidom!出於好奇,你知道爲什麼會發生這種情況? –

+1

[「最小的驚訝」和可變的默認參數]可能的重複(http://stackoverflow.com/questions/1132941/least-astonishment-and-the-mutable-default-argument) – Boud

回答

-1

編輯:我現在看到有在答覆對此的解釋^

我不明白這是由引起的,只是還沒有,但你可以分別定義你的dataframes繞過它然後將其列入清單。

In [2]: df1 = pd.DataFrame() 
In [3]: df2 = pd.DataFrame() 
In [4]: a = [df1, df2] 
In [5]: a[0]['a'] = [1,2,3] 
In [6]: a[0] 
Out[6]: 
    a 
0 1 
1 2 
2 3 

In [7]: a[1] 
Out[7]: 
Empty DataFrame 
Columns: [] 
Index: [] 
0

答案是因爲當你定義與語法

x = [something]*n 

你一個列表,其中每個項目都是一樣的東西最終名單。它不會創建副本,它引用相同的對象:

>>> import pandas as pd 
>>> a=pd.DataFrame() 
>>> g=[a]*2 
>>> g 
1: [Empty DataFrame 
Columns: [] 
Index: [], Empty DataFrame 
Columns: [] 
Index: []] 
>>> id(g[0]) 
4: 129264216L 
>>> id(g[1]) 
5: 129264216L 

的意見都指向你應該通過閱讀和神交一些有用的例子。

爲了避免它在你的情況下,只需使用實例列表中的另一種方式:

>>> map(lambda x: pd.DataFrame(),range(2)) 
6: [Empty DataFrame 
Columns: [] 
Index: [], Empty DataFrame 
Columns: [] 
Index: []] 
>>> [pd.DataFrame() for i in range(2)] 
7: [Empty DataFrame 
Columns: [] 
Index: [], Empty DataFrame 
Columns: [] 
Index: []] 
>>>