我正在使用多个列进行数据框外部联接:
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
有人可以告诉我我要去哪里了吗
答案 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)
您在df1
和df2
上都有相同的重复项,因此合并的df
的行数是每个重复项的两倍。一种简单的解决方案是通过drop_duplicates
和merge
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