熊猫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
这是一个错误?我能做些什么来阻止它?
谢谢!
答
编辑:我现在看到有在答复对此的解释^
我不明白这是由引起的,只是还没有,但你可以分别定义你的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