Pandas DataFrame分配问题 - 可能的错误?

时间:2014-12-30 21:01:45

标签: python-2.7 pandas

我正在尝试编写Python Pandas代码以合并两个DataFrame中的数据,如果索引和列相同,则新DataFrame的数据将替换旧的DataFrame数据。 Pandas中似乎存在一个错误,有时会导致列名混淆。

这是一个例子。首先,创建两个DataFrame:

In [1]: df1 = DataFrame([[1, 2, 3, 4]]*3, columns=["A1", "B2", "C3", "D4"], index=[0, 1, 2])

In [2]: df2 = DataFrame([[30, 10, 40, 20]]*3, columns=["C3", "A1", "D4", "B2"], index=[1, 2, 3])

In [3]: df1
Out[3]:
   A1  B2  C3  D4
0   1   2   3   4
1   1   2   3   4
2   1   2   3   4

[3 rows x 4 columns]

In [4]: df2
Out[4]:
   C3  A1  D4  B2
1  30  10  40  20
2  30  10  40  20
3  30  10  40  20

[3 rows x 4 columns]

观察到df2具有相同的列,但顺序不同。数据与10 * df1相同。

现在合并它们:

In [5]: merge_df = DataFrame(index=df1.index.union(df2.index), columns=df1.columns.union(df2.columns))

In [6]: merge_df.loc[df1.index, df1.columns] = df1

In [7]: merge_df.loc[df2.index, df2.columns] = df2

In [8]: merge_df
Out[8]:
   A1  B2  C3  D4
0   1   2   3   4
1  10  20  30  40
2  10  20  30  40
3  10  20  30  40

[4 rows x 4 columns]

这可以按预期工作。

现在重新定义df2,使其具有与df1类似的索引。

In [9]: df2 = DataFrame([[30, 10, 40, 20]]*3, columns=["C3", "A1", "D4", "B2"], index=[0, 1, 2])

In [10]: df2
Out[10]:
   C3  A1  D4  B2
0  30  10  40  20
1  30  10  40  20
2  30  10  40  20

[3 rows x 4 columns]

然后使用与以前相同的代码进行合并:

In [11]: merge_df = DataFrame(index=df1.index.union(df2.index), columns=df1.columns.union(df2.columns))

In [12]: merge_df.loc[df1.index, df1.columns] = df1

In [13]: merge_df.loc[df2.index, df2.columns] = df2

In [14]: merge_df
Out[14]:
   A1  B2  C3  D4
0  30  10  40  20
1  30  10  40  20
2  30  10  40  20

[3 rows x 4 columns]

为什么列名和数据混在一起?我使用.loc错了吗?将最后一行更改为.ix无法解决问题。它只适用于我这样做:

In [15]: merge_df = DataFrame(index=df1.index.union(df2.index), columns=df1.columns.union(df2.columns))

In [16]: merge_df.loc[df1.index, df1.columns] = df1

In [17]: merge_df[df2.columns] = df2

In [18]: merge_df
Out[18]:
   A1  B2  C3  D4
0  10  20  30  40
1  10  20  30  40
2  10  20  30  40

[3 rows x 4 columns]

这是理想的结果。

我可能在这里做错了,但是如果我有,有一些重要的事情我不了解DataFrames,我可能在我的代码中的其他地方犯了类似的错误。如果是这种情况,请解释。

我无法检查Pandas gitbug bugtracker,因为该网站被禁止工作。任何帮助将不胜感激。

In [19]: pd.__version__
Out[19]: '0.13.1'

1 个答案:

答案 0 :(得分:1)

我需要升级到Pandas 0.14.0,根据github上的jreback:

https://github.com/pydata/pandas/issues/9200