首页 > 解决方案 > 如何基于没有列顺序的两列合并数据框?

问题描述

我遇到了以下问题。我想合并多列上的两个数据框。示例数据帧如下: df1:

df1:
playerA   playerB  Weight
kim         lee      1
jackson     kim      3
dan         lee      4


df2:
name1   name2      score
dan         lee      11
dan         kim      23
jackson     kim      44
lee         kim      35
Jackson     lee      26
lee         dan      27

我想基于两列合并这两个数据框。 df1[['playerA','playerB']],df2[['name1','name2']]

但问题是,我想合并这两个数据框而不考虑列的顺序。

我试过

result = pd.merge(df1, df2, on =df1[['playerA','playerB']],df2[['name1','name2']])

但它没有用。

这就是我想要的,

df1:
playerA   playerB  Weight score
kim         lee      1    
jackson     kim      3
dan         lee      4

I want to merge df1 and df2 by using two columns from each data frame without considering the order 
(df1[['playerA','playerB']],df2[['name1','name2']])

df2_merge:
name1   name2      score  weight
dan         lee      11    4
kim         lee      23    1
jackson     kim      44    3
lee         kim      35    1
kim        jacson     26   3
lee         dan      27    4

And then I want to delete the row which has the same name list.

Thus, here is my final wishes

df2_merge_ final:
name1   name2      score  weight
dan         lee      11    4
kim         lee      23    1
jackson     kim      44    3

我不确定还能尝试什么。有什么建议吗?谢谢 :)

标签: pythonpandasdataframe

解决方案


您可以添加由排序值填充的新列,然后merge与删除不必要的列一起使用:

df1[['a','b']] = np.sort(df1[['playerA','playerB']], axis=1)
df2[['a','b']] = np.sort(df2[['name1','name2']], axis=1)

result = pd.merge(df1, df2, on=['a','b']).drop(['a','b','name1','name2'], axis=1)
print (result)
   playerA playerB  Weight  score
0      kim     lee       1     35
1  jackson     kim       3     44
2      dan     lee       4     11
3      dan     lee       4     27

如果需要第一个唯一组合添加DataFrame.drop_duplicates

df1[['a','b']] = np.sort(df1[['playerA','playerB']], axis=1)
df2[['a','b']] = np.sort(df2[['name1','name2']], axis=1)

df2 = df2.drop_duplicates(['a','b'])

result = pd.merge(df1, df2, on=['a','b']).drop(['a','b','name1','name2'], axis=1)
print (result)
   playerA playerB  Weight  score
0      kim     lee       1     35
1  jackson     kim       3     44
2      dan     lee       4     11

推荐阅读