當將新列分配給列表中的一個數據幀時,它將其複製到所有其他數據幀。例如:熊貓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
這是一個錯誤?我能做些什麼來阻止它?
謝謝!
當將新列分配給列表中的一個數據幀時,它將其複製到所有其他數據幀。例如:熊貓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
這是一個錯誤?我能做些什麼來阻止它?
謝謝!
編輯:我現在看到有在答覆對此的解釋^
我不明白這是由引起的,只是還沒有,但你可以分別定義你的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: []
答案是因爲當你定義與語法
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: []]
>>>
當您嘗試初始化'[] * N'名單這是已知的行爲。使用'a = [pd.DataFrame()for range in(2)]'來初始化列表。 – Psidom
謝謝Psidom!出於好奇,你知道爲什麼會發生這種情況? –
[「最小的驚訝」和可變的默認參數]可能的重複(http://stackoverflow.com/questions/1132941/least-astonishment-and-the-mutable-default-argument) – Boud