Pandas DataFrame列出了奇怪的行为

时间:2016-11-16 14:13:33

标签: python pandas 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

这是一个错误吗?我该怎么做才能阻止它?

谢谢!

2 个答案:

答案 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: []