我正在尝试编写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'
答案 0 :(得分:1)
我需要升级到Pandas 0.14.0,根据github上的jreback: