考虑以下数据框:
import pandas as pd
df1 = pd.DataFrame({'id': list('fghij'), 'A': ['A' + str(i) for i in range(5)]})
A id
0 A0 f
1 A1 g
2 A2 h
3 A3 i
4 A4 j
df2 = pd.DataFrame({'id': list('fg'), 'B': ['B' + str(i) for i in range(2)]})
B id
0 B0 f
1 B1 g
df3 = pd.DataFrame({'id': list('ij'), 'B': ['B' + str(i) for i in range(3, 5)]})
B id
0 B3 i
1 B4 j
我想合并它们来获取
A id B
0 A0 f B0
1 A1 g B1
2 A2 h NaN
3 A3 i B3
4 A4 j B4
受到this answer的启发,我试过了
final = reduce(lambda l, r: pd.merge(l, r, how='outer', on='id'), [df1, df2, df3])
但不幸的是它产生了
A id B_x B_y
0 A0 f B0 NaN
1 A1 g B1 NaN
2 A2 h NaN NaN
3 A3 i NaN B3
4 A4 j NaN B4
此外,我检查了this question,但我无法使解决方案适应我的问题。另外,我没有找到docs for pandas.merge中的任何选项来实现这一目标。
在我的实际问题中,数据帧列表可能会更长,数据帧的大小可能会更大。
有没有" pythonic"直接这样做的方式,没有"后处理"?如果df2和df3的列B重叠(例如,如果最终数据帧的B列中可能存在多个候选值),则提供一个引发异常的解决方案将是完美的。
答案 0 :(得分:1)
考虑pd.concat
+ groupby
?
pd.concat([df1, df2, df3], axis=0).groupby('id').first().reset_index()
id A B
0 f A0 B0
1 g A1 B1
2 h A2 NaN
3 i A3 B3
4 j A4 B4