带有重合列名的pandas.merge

时间:2018-03-26 07:08:48

标签: python pandas merge

考虑以下数据框:

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列中可能存在多个候选值),则提供一个引发异常的解决方案将是完美的。

1 个答案:

答案 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