Pandas 如果同一行重复,则从另一个数据框中查找值

Pandas If duplicate on same row, lookup value from another dataframe

我有这种情况,但我不知道该怎么做。

changeme 列中的值等于 df1 中同一行的 lookforme 列中的值时,我想在 [=] 中查找该值df2 的 16=] 列,获取相应的 grabme 值并覆盖 df1changeme 中的值。

如果 lookformedf2 上多次出现,则只匹配第一个。

我尝试了一些方法,但一无所获,当我尝试因式分解等时,有人抱怨数据帧不均匀

          changeme       name   qty  lookforme
0          1296477  ItemName2  3.16    1296477
1            62328  ItemName1  7.94      62328
2           233201  ItemName3  5.56     233201
3      66074000105  ItemName4  6.88     233694

           matchme       grabme
0            62328  35422028768
1           162592  62673001137
2           163200  15422029895
3           164123  45492029154
4           166596  35422031737
5           232264  75372043938
6           232267  95462043655
7           233201  35422044775
8           233201  24613628530
9           233226  35412044812
10          233694  66074000105
11          235466  35422042863
12          272021  85422052947
13          272691  35422053340
14          272872  27536196938
15          273729  39456023149
16          284848  27536197195
17          284861  62672008054
18         1296477  35421853202
19         1296477  75841596436
20         2296518  97630194508

预期结果:

          changeme       name   qty  lookforme
0      35421853202  ItemName2  3.16    1296477
1      35422028768  ItemName1  7.94      62328
2      35422044775  ItemName3  5.56     233201
3      66074000105  ItemName4  6.88     233694

让我们尝试以下操作:

过滤与 df1 中的“changeme”匹配的“lookforme”值,并使用 locdf2 中的“matchme”值中找到这些值。由于某些“lookforme”值在 df2 中多次出现,请删除重复项并保留第一个。

然后使用 map:

更新 df1 中的“changeme”值
cond = df1['changeme'] == df1['lookforme']
new_values = df2.drop_duplicates('matchme').loc[df2['matchme'].isin(df1.loc[cond, 'changeme'])]
df1.loc[cond, 'changeme'] = df1.loc[cond, 'changeme'].map(new_values.set_index('matchme')['grabme'])

输出:

      changeme       name   qty  lookforme
0  35421853202  ItemName2  3.16    1296477
1  35422028768  ItemName1  7.94      62328
2  35422044775  ItemName3  5.56     233201
3  66074000105  ItemName4  6.88     233694

你也可以试试这个:

res = pd.merge(df1, df2,
               left_on='lookforme', 
               right_on='matchme-ascend').drop_duplicates('lookforme').reset_index(drop=True)
# you have duplicates in df2 so we should-^^^^^^^^^^^^^^^

df1['changeif=look4m'] = res.apply(lambda x: x['grabme'] 
                                   if x['changeif=look4m']==x['lookforme'] 
                                   else x['changeif=look4m'], axis=1)
print(df1)
'''
   changeif=look4m       name   qty  lookforme
0      35421853202  ItemName2  3.16    1296477
1      35422028768  ItemName1  7.94      62328
2      35422044775  ItemName3  5.56     233201
3      66074000105  ItemName4  6.88     233694