如何比较列不唯一的两个不同数据帧的两列?

时间:2016-09-13 13:51:33

标签: python pandas dataframe

我有两个不同的数据帧:df1和df2

df1 :                                
    Id lkey                           
0  foo  foo                        
1  bar  bar                        
2  baz  baz                        
3  foo  foo                        
4  bar  bar                        
5  foo  foo                        
6  bar  bar
7  bar  bar
8  bar  bar

df2 :
    e rkey value    y
0  aaa  foo   aaa  foo
1  NaN  bar   bbb  bar
2  ccc  baz   ccc  baz
3  NaN  mac   ddd  fff
4  NaN  xyz   eee  mmm
5  NaN  mnb   fff  NaN
6  NaN  foo   aaa  NaN

Edit1:添加第6行作为副本。

我想在这个数据帧上执行一项任务。我想比较lkey和rkey列。

Edit2:

注意: lkey 列包含所有重复值, rkey 列包含一些重复值。

获取lkey列的第一个值,即foo将此值与dataframe的rkey列的值进行比较。如果找到匹配,我想知道df1数据帧列名中此行的value值列为匹配。 (在每种情况下,匹配都将获得lkey和rkey,即df2的rkey列中可用的df1中存在的任何lkey值。)

我已经尝试过merge

result = df1.merge(df2, left_on='lkey', right_on='rkey', how='outer')

输出:

     Id lkey    e rkey value    y
0   foo  foo  aaa  foo   aaa  foo
1   foo  foo  aaa  foo   aaa  foo
2   foo  foo  aaa  foo   aaa  foo
3   bar  bar  NaN  bar   bbb  bar
4   bar  bar  NaN  bar   bbb  bar
5   bar  bar  NaN  bar   bbb  bar
6   bar  bar  NaN  bar   bbb  bar
7   bar  bar  NaN  bar   bbb  bar
8   baz  baz  ccc  baz   ccc  baz
9   NaN  NaN  NaN  mac   ddd  fff
10  NaN  NaN  NaN  xyz   eee  mmm
11  NaN  NaN  NaN  mnb   fff  NaN

我不想要11排。在我的df1中,只有9行可用于列Id和lkey。我只想添加具有特定映射的匹配列。

预期输出:

Id  lkey match
0  foo  foo  aaa
1  bar  bar  bbb
2  baz  baz  ccc
3  foo  foo  aaa
4  bar  bar  bbb
5  foo  foo  aaa
6  bar  bar  bbb
7  bar  bar  bbb
8  bar  bar  bbb

如何实现我想做的事情?

编辑:以前我说过rkey列包含唯一值,但我只面临问题,因为rkey列包含重复值。

1 个答案:

答案 0 :(得分:2)

>>> (df1
     .merge(df2[['rkey', 'value']].drop_duplicates(), left_on='lkey', right_on='rkey', how='left')
     .drop('rkey', axis='columns')
     .rename(columns={'value': 'match'})
    )
    Id lkey match
0  foo  foo   aaa
1  bar  bar   bbb
2  baz  baz   ccc
3  foo  foo   aaa
4  bar  bar   bbb
5  foo  foo   aaa
6  bar  bar   bbb
7  bar  bar   bbb
8  bar  bar   bbb

如果两个数据框中的键列具有相同的名称,则只需使用on='key'即可,无需删除右键。