首页 > 解决方案 > 在索引上合并 Panda DataFrame,添加额外的列,并且没有重复的索引

问题描述

df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
 'B': ['B0', 'B1', 'B2', 'B3'],
 'C': ['C0', 'C1', 'C2', 'C3'],
 'D': ['D0', 'D1', 'D2', 'D3']},
index=[0, 1, 2, 3])

df2 = pd.DataFrame({'A': ['A4', 'A5', 'A6', 'A7'],
 'B': ['B4', 'B5', 'B6', 'B7'],
 'C': ['C4', 'C5', 'C6', 'C7'],
 'D': ['D4', 'D5', 'D6', 'D7']},
index=[4, 5, 6, 7])

df22 = pd.DataFrame({'A2': ['A4', 'A5', 'A6', 'A7'],
 'B2': ['B4', 'B5', 'B6', 'B7'],
 'C2': ['C4', 'C5', 'C6', 'C7'],
 'D2': ['D4', 'D5', 'D6', 'D7']},
index=[4, 5, 6, 7])

frames = [df1, df2, df22]
result = pd.concat(frames,sort=False)
result

在此处输入图像描述

如我们所见,索引 4、5、6、7 重复,并添加了 NAN。 如何有意义地合并..?

NaN at A2 ,B2 ,C2, D2, 在索引 0,1,2,3 是可以接受的

索引 4、5、6、7 不应重复且不应包含 NaN

标签: pythonpandas

解决方案


你想要这样的东西吗?您可以使用数据帧索引pd.concat将前两个数据帧垂直join转换为 df22。

 pd.concat([df1,df2]).join(df22)

输出:

    A   B   C   D   A2   B2   C2   D2
0  A0  B0  C0  D0  NaN  NaN  NaN  NaN
1  A1  B1  C1  D1  NaN  NaN  NaN  NaN
2  A2  B2  C2  D2  NaN  NaN  NaN  NaN
3  A3  B3  C3  D3  NaN  NaN  NaN  NaN
4  A4  B4  C4  D4   A4   B4   C4   D4
5  A5  B5  C5  D5   A5   B5   C5   D5
6  A6  B6  C6  D6   A6   B6   C6   D6
7  A7  B7  C7  D7   A7   B7   C7   D7

另一种方法是使用combine_first

from functools import reduce
reduce(lambda x,y: x.combine_first(y), [df1,df2,df22])

或者

df1.combine_first(df2).combine_first(df22)

输出:

    A   A2   B   B2   C   C2   D   D2
0  A0  NaN  B0  NaN  C0  NaN  D0  NaN
1  A1  NaN  B1  NaN  C1  NaN  D1  NaN
2  A2  NaN  B2  NaN  C2  NaN  D2  NaN
3  A3  NaN  B3  NaN  C3  NaN  D3  NaN
4  A4   A4  B4   B4  C4   C4  D4   D4
5  A5   A5  B5   B5  C5   C5  D5   D5
6  A6   A6  B6   B6  C6   C6  D6   D6
7  A7   A7  B7   B7  C7   C7  D7   D7

推荐阅读