在 Python (pandas) 的多个列中进行 Vlookup

Posted

技术标签:

【中文标题】在 Python (pandas) 的多个列中进行 Vlookup【英文标题】:Vlookup in multiple columns at Python (pandas) 【发布时间】:2019-10-06 00:32:03 【问题描述】:

我在 SO 看到很多帖子,询问如何在 Python 中执行类似于 VLOOKUP 的操作,并注意到大多数答案表明使用 mergemap ,但我不知道如何应用这些功能在这种情况下。 我有以下两个数据框(REGISTER 和 WEEK)

注册:

NAME   |PARTNER
Rafael |Roger
Sergio |Gabriel
Edson  |Ney
Alan   |Nelson
...    |...

周:

MONDAY|PARTNER|TUESDAY|PARTNER|WEDNESDAY|PARTNER|...
Rafael| ??????|Sergio|??????  |Sergio   |????????
Edson | ??????|Edson |??????  |Alan     |????????
Alan  | ??????|Rafael|??????  |Edson    |????????

“???”应该替换为类似于 =VLOOKUP('name in the left', REGISTER, 2, FALSE)

【问题讨论】:

这很棘手,因为 Pandas 不太喜欢多列具有相同名称的情况,您应该将 PARTNER 重命名为 MONDAY_PARTNER TUEDSDAY_PARTNER等... 即使重命名,我如何应用合并? 【参考方案1】:

使用Series.mapSeries by zip 对通过索引过滤的列名称,因此第一列映射到第二、第三到第四列,每列类似:

s = REGISTER.set_index('NAME')['PARTNER']

for c1, c2 in zip( WEEK.columns[::2], WEEK.columns[1::2]):
    #print (c1, c2)
    WEEK[c2] = WEEK[c1].map(s)

print (WEEK)
   MONDAY PARTNER TUESDAY PARTNER.1 WEDNESDAY PARTNER.2
0  Rafael   Roger  Sergio   Gabriel    Sergio   Gabriel
1   Edson     Ney   Edson       Ney      Alan    Nelson
2    Alan  Nelson  Rafael     Roger     Edson       Ney

如果值不匹配,map 创建缺失值。因此,如果需要原始值以获得不匹配的值,请使用 replace 而不是 map

【讨论】:

以上是关于在 Python (pandas) 的多个列中进行 Vlookup的主要内容,如果未能解决你的问题,请参考以下文章

Python Pandas根据多个其他列中的条件替换一列中的值[重复]

Python Pandas - 数据帧列中的查询和布尔值

在 python pandas 中使用 groupby 的列中出现的百分比

Pandas str.contains - 在字符串中搜索多个值并在新列中打印值[重复]

Python:在一列中为另一列中的单个值显示多个值

使用python处理列中的多个值