首页 > 解决方案 > 匹配两列中的数据并将匹配添加到数据框

问题描述

我有两个数据框:第一个数据框

          Column1     Column2    Column3          
       0  A1          B1         C1
       1  A2          B2         C2
       2  A3          B3         C3
       2  A4          B4         C4

第二个数据框

          Column1     Column2         
       0  A1          S1         
       1  B3          S2         
       2  A3          S3        
       3  B5          S4  
       4  A5          S5       

我想在数据框 1 中的 Column1、COlumn2 和数据框 2 中的 Column1 上加入这两个表

Whatever A* value from DF2 matches with Column1 values in DF1, the corresponding Column2 value goes into Column 4 in output.
Whatever D* value from DF2 matches with Column1 values in DF1, the corresponding Column2 value goes into Column 5 in output.

输出应该是这样的:

          Column1     Column2    Column3   Column4     Column5      
       0  A1          B1         C1        S1
       1  A2          B2         C2                    
       2  A3          B3         C3        S3            S2
       2  A4          B4         C4

A1 匹配,因此 S1 进入第 4 列 B3 匹配,因此 S2 进入第 5 列 A3 匹配,因此 S3 进入第 4 列 B5 不匹配,因此根本不显示 A5 不匹配,因此根本不显示。

我这样做的肮脏方式是将 A* 和 B* 值分离到两个单独的数据帧中,并使用外连接将它们合并。但我正在寻找一种无需为 df2 数据创建两个单独的数据集即可实现此目的的方法。

标签: pythonpython-3.xpandasdataframe

解决方案


以下代码在您的示例中完成了这项工作:

result_df = (
    df1.merge(
        df2.rename({'Column2': 'Column4'}, axis='columns'), how='left', on=['Column1']
    )
    .merge(
        df2.rename({'Column2': 'Column5'}, axis='columns'),
        how='left',
        left_on=['Column2'],
        right_on=['Column1'],
    )
    .drop(['Column1_y'], axis='columns')
    .rename({'Column1_x': 'Column1'}, axis='columns')
)

我对最后两个命令drop并不满意,rename但我无法避免第二次合并中列的重复。

编辑:忘记了axis最后一个rename函数中的参数。


推荐阅读