Pandas 如果同一行重复,则从另一个数据框中查找值
Pandas If duplicate on same row, lookup value from another dataframe
我有这种情况,但我不知道该怎么做。
当 changeme
列中的值等于 df1
中同一行的 lookforme
列中的值时,我想在 [=] 中查找该值df2
的 16=] 列,获取相应的 grabme
值并覆盖 df1
上 changeme
中的值。
如果 lookforme
在 df2
上多次出现,则只匹配第一个。
我尝试了一些方法,但一无所获,当我尝试因式分解等时,有人抱怨数据帧不均匀
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”值,并使用 loc
在 df2
中的“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
我有这种情况,但我不知道该怎么做。
当 changeme
列中的值等于 df1
中同一行的 lookforme
列中的值时,我想在 [=] 中查找该值df2
的 16=] 列,获取相应的 grabme
值并覆盖 df1
上 changeme
中的值。
如果 lookforme
在 df2
上多次出现,则只匹配第一个。
我尝试了一些方法,但一无所获,当我尝试因式分解等时,有人抱怨数据帧不均匀
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”值,并使用 loc
在 df2
中的“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