我有两个不同的数据帧: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列包含重复值。
答案 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'
即可,无需删除右键。