繁体   English   中英

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

[英]How to compare two columns of two different dataframes whose columns are not unique?

我有两个不同的数据框: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:添加了第六行作为重复项。

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

编辑2:

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

拾取lkey列的第一个值,即foo,将该值与数据帧的rkey列的值进行比较。 如果找到匹配项,我想知道df1数据帧列名称中该行的value列的值是否匹配。 (在每种情况下,lkey和rkey都会匹配,即df1的rkey值可在df2的rkey列中找到。)

我已经尝试过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中,Id和lkey列只有9行可用。 我只想添加具有特定映射的匹配列。

预期产量:

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列包含重复值。

>>> (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' ,而无需删除正确的键。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM