【问题标题】:How to compare two columns of two different dataframes whose columns are not unique?如何比较两个不同数据框的列不唯一的两列?
【发布时间】:2017-01-21 03:51:15
【问题描述】:

我有两个不同的数据框: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 列。

编辑2:

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

获取 lkey 列的第一个值,即 foo 将此值与数据帧的 rkey 列的值进行比较。如果找到匹配项,我想知道 df1 数据框列名中该行的值列的值作为匹配项。 (在每种情况下,lkey 和 rkey 都会得到匹配,即 df1 中存在的任何 lkey 值在 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 中,只有 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 列包含重复值。

【问题讨论】:

  • 上述解决方案正是您要找的。这是一个基本的 sql 合并。
  • 请参阅编辑并抱歉。刚才我明白了我的问题。

标签: python pandas dataframe


【解决方案1】:
>>> (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' 而无需删除正确的键。

【讨论】:

  • @Alexander- 请参阅编辑并抱歉。刚才我明白了我的问题。
  • drop_duplicates 如果每个键仍有多个值,则需要外连接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-06
  • 2020-04-29
  • 2020-02-04
相关资源
最近更新 更多