【问题标题】:How to merge two data frames based on one column in one data frame and two column in second dataframe如何基于一个数据框中的一列和第二个数据框中的两列合并两个数据框
【发布时间】:2021-01-11 11:16:33
【问题描述】:

我有两个数据框:

df1 = pd.DataFrame({'A': ['A1', 'A2', 'A3','A4','A5']})

df2 = pd.DataFrame({'AA': ['A1', 'A3','A16','A1'],
                      'BB': ['A2', 'Z1','A12','X9'],
                      'CC': ['121', '345','444','432'],
                      'DD': ['D0', 'D1','783','980']})

df1:

    A
0   A1
1   A2
2   A3
3   A4
4   A5

df2:

    AA  BB  CC  DD
0   A1  A2  121 D0
1   A3  Z1  345 D1
2   A16 A12 444 783
3   A1  X9  432 980

我想合并这两个数据框,条件是生成的数据框由 DF2 的那些行组成,其 AA 列或 BB 列中的值与 DF1 中 A 列中的值匹配。

例如:

    AA  BB  CC  DD
0   A1  A2  121 D0
1   A1  A2  121 D0
2   A1  X9  432 980
1   A3  Z1  345 D1

我尝试了以下方式,但我不确定这是否是正确的方法。 首先我在 A(df1) 和 AA(df2) 列上合并:

half1 = pd.merge(df1, df2,  how='left', left_on=['A'], right_on = ['AA'])

然后我在 A(df1) 和 BB(df2) 列上合并:

half2 = pd.merge(df1, df2,  how='left', left_on=['A'], right_on = ['BB'])

然后取联合:

union = half1.merge(half2, how='outer')

但结果不是我想要的。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    通过Series.isin 过滤两列的数据工作测试成员资格boolean indexing 然后concat:

    df3 = pd.concat([df2[df2['AA'].isin(df1['A'])],
                     df2[df2['BB'].isin(df1['A'])]]).sort_index()
    print (df3)
       AA  BB   CC   DD
    0  A1  A2  121   D0
    0  A1  A2  121   D0
    1  A3  Z1  345   D1
    3  A1  X9  432  980
    

    您的解决方案应该通过rename 列和pd.concat 的内部连接来更改:

    half1 = pd.merge(df1.rename(columns={'A':'AA'}), df2, on='AA')
    half2 = pd.merge(df1.rename(columns={'A':'BB'}), df2, on='BB')
    
    df3 = pd.concat([half1,half2]).sort_index()
    print (df3)
       AA  BB   CC   DD
    0  A1  A2  121   D0
    0  A1  A2  121   D0
    1  A1  X9  432  980
    2  A3  Z1  345   D1
    

    【讨论】:

    • 按预期工作。
    猜你喜欢
    • 1970-01-01
    • 2018-01-30
    • 1970-01-01
    • 1970-01-01
    • 2014-01-03
    • 2019-05-01
    • 2021-11-20
    • 2017-08-02
    • 2019-12-16
    相关资源
    最近更新 更多