熊猫DataFrame列表奇怪的行为

问题描述:

当将新列分配给列表中的一个数据帧时,它将其复制到所有其他数据帧。例如:熊猫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

编辑:我现在看到有在答复对此的解释^

我不明白这是由引起的,只是还没有,但你可以分别定义你的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: []] 
>>>