使用多列进行数据帧连接

2024-10-01 02:36:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用多列执行数据帧外部联接:

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

有人能告诉我哪里出错了吗


Tags: 数据代码dfonpddf1df2columnb
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

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

相关问题 更多 >