使用多个列连接熊猫数据框

时间:2019-11-19 00:53:54

标签: python pandas dataframe

我正在使用多个列进行数据框外部联接:

DF1:

ColumnA ColumnB ColumnC ColumnD
1          2      3        4
1          2      3        4

DF2:

ColumnE ColumnF ColumnG ColumnH
1          2      3        4
1          2      3        4

合并代码:

df= pd.merge(DF1, DF2, left_on=['ColumnA','ColumnB','ColumnC','ColumnD'], right_on=['ColumnE','ColumnF','ColumnG','ColumnH'], how='outer')

实际结果:

ColumnA ColumnB ColumnC ColumnD ColumnE ColumnF ColumnG ColumnH
1        2       3       4         1      2       3       4
1        2       3       4         1      2       3       4
1        2       3       4         1      2       3       4
1        2       3       4         1      2       3       4

预期结果(当列的组合在两个数据集中完全匹配时,这些值应仅显示两次):

ColumnA ColumnB ColumnC ColumnD ColumnE ColumnF ColumnG ColumnH
1        2       3       4         1      2       3       4
1        2       3       4         1      2       3       4

有人可以告诉我我要去哪里了吗

2 个答案:

答案 0 :(得分:2)

因此,我们需要merge以及由cumcount创建的附加密钥

df1=df1.assign(Key=df1.groupby(list(df1)).cumcount())
df2=df2.assign(Key=df1.groupby(list(df1)).cumcount()

df1.merge(df2, left_on=['ColumnA','ColumnB','ColumnC','ColumnD','Key'],
               right_on=['ColumnE','ColumnF','ColumnG','ColumnH','Key'], how='outer')
Out[19]: 
   ColumnA  ColumnB  ColumnC  ColumnD  Key  ColumnE  ColumnF  ColumnG  ColumnH
0        1        2        3        4    0        1        2        3        4
1        1        2        3        4    1        1        2        3        4

答案 1 :(得分:2)

您在df1df2上都有相同的重复项,因此合并的df的行数是每个重复项的两倍。一种简单的解决方案是通过drop_duplicatesmerge

保持一个数据帧唯一
df = pd.merge(df1.drop_duplicates(), df2, left_on=['ColumnA','ColumnB' ,'ColumnC','ColumnD'], right_on=['ColumnE','ColumnF','ColumnG','ColumnH'], how='outer')

Out[742]:
   ColumnA  ColumnB  ColumnC  ColumnD  ColumnE  ColumnF  ColumnG  ColumnH
0        1        2        3        4        1        2        3        4
1        1        2        3        4        1        2        3        4