将新列分配给列表中的一个数据帧时,会将其复制到所有其他数据帧。例如:
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
这是一个错误吗?我该怎么做才能阻止它?
谢谢!
答案 0 :(得分:0)
答案是因为当您使用该语法定义列表时
x = [something]*n
你最终会得到一个列表,其中每个项目都是相同的东西。它不创建副本,它引用SAME对象:
>>> 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: []]
>>>
答案 1 :(得分:-1)
编辑:我现在看到回复中有一个解释^
我不明白这是由什么引起的,但你可以通过在将它们放入列表之前单独定义数据帧来解决它。
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: []