合并Index上的Panda DataFrame,添加其他列,并且没有重复的索引

use*_*922 4 python pandas

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
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

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

可以接受索引为0、1、2、3的A2,B2,C2,D2处的NaN

但是索引4,5,6,7不应重复且不应包含NaN

Sco*_*ton 6

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

 pd.concat([df1,df2]).join(df22)
Run Code Online (Sandbox Code Playgroud)

输出:

    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
Run Code Online (Sandbox Code Playgroud)

另一种方法是使用combine_first

from functools import reduce
reduce(lambda x,y: x.combine_first(y), [df1,df2,df22])
Run Code Online (Sandbox Code Playgroud)

要么

df1.combine_first(df2).combine_first(df22)
Run Code Online (Sandbox Code Playgroud)

输出:

    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
Run Code Online (Sandbox Code Playgroud)