You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python(pandas)中实现多列VLOOKUP功能?

在Python中实现多列场景下的VLOOKUP逻辑(对应你的REGISTER和WEEK DataFrame)

嘿,我完全懂你这种困惑——看了一堆关于Python实现VLOOKUP的回答,都说用merge或者map,但到自己的多列场景就不知道怎么下手了对吧?别慌,我结合你的两个DataFrame场景给你拆解清楚。

首先先明确下你的数据结构(我模拟了一份样例,你可以对应自己的实际数据):

  • REGISTER:两列,NAME(姓名)和PARTNER(对应搭档)
  • WEEK:多组「星期姓名列+星期搭档列」,比如MONDAY_NAME、MONDAY_PARTNER,TUESDAY_NAME、TUESDAY_PARTNER……其中搭档列的????需要通过对应姓名列匹配REGISTER里的搭档来填充。

方法一:用map快速处理(适合列名有规律的场景)

这是最贴近Excel VLOOKUP逻辑的方法,核心是先把REGISTER转成「姓名→搭档」的映射字典,再逐个对WEEK里的搭档列进行填充。

步骤1:创建姓名-搭档映射字典

先从REGISTER生成一个字典,方便快速查找:

import pandas as pd

# 模拟你的REGISTER DataFrame
register = pd.DataFrame({
    'NAME': ['Alice', 'Charlie', 'Eve'],
    'PARTNER': ['Bob', 'Dana', 'Frank']
})

# 生成映射字典
partner_map = register.set_index('NAME')['PARTNER'].to_dict()

步骤2:批量填充WEEK里的搭档列

如果你的WEEK列名是规律的(比如X_NAME对应X_PARTNER),可以用循环批量处理,不用手动写每一列:

# 模拟你的WEEK DataFrame
week = pd.DataFrame({
    'MONDAY_NAME': ['Alice', 'Eve'],
    'MONDAY_PARTNER': ['????', '????'],
    'TUESDAY_NAME': ['Charlie', 'Alice'],
    'TUESDAY_PARTNER': ['????', '????']
})

# 遍历所有姓名列,填充对应的搭档列
for col in week.columns:
    if '_NAME' in col:
        # 提取星期前缀,比如从MONDAY_NAME得到MONDAY
        day_prefix = col.replace('_NAME', '')
        # 对应的搭档列名
        partner_col = f'{day_prefix}_PARTNER'
        # 用map填充,替换????
        week[partner_col] = week[col].map(partner_map)

执行后你的WEEK里的????就会被替换成对应的搭档了!如果某个姓名不在REGISTER里,map会返回NaN,你可以用.fillna('未找到')来替换成你想要的内容。

方法二:用merge处理(适合大量列或复杂场景)

如果你的WEEK列特别多,或者列名没那么规律,可以先把宽表转成窄表,merge后再转回宽表,这种方法扩展性更强。

步骤1:把WEEK转成窄表(重塑数据)

# 把WEEK的列拆分成「星期+类型(NAME/PARTNER)」
melted = week.melt(var_name='col_name', value_name='value')
melted[['day', 'type']] = melted['col_name'].str.split('_', expand=True)

# 转成每个星期对应姓名和搭档的结构
pivoted = melted.pivot(index='day', columns='type', values='value').reset_index()

步骤2:和REGISTER进行merge(对应VLOOKUP的匹配逻辑)

# 按NAME匹配,获取对应的PARTNER
merged = pivoted.merge(register, on='NAME', how='left')
# 替换原来的PARTNER列(原来的????)
merged['PARTNER'] = merged['PARTNER_y'].fillna(merged['PARTNER_x'])
merged = merged.drop(columns=['PARTNER_x', 'PARTNER_y'])

步骤3:转回宽表结构

# 再转成原来的宽表格式
final_melted = merged.melt(id_vars=['day'], var_name='type', value_name='value')
final_melted['col_name'] = final_melted['day'] + '_' + final_melted['type']
final_week = final_melted.pivot(index=None, columns='col_name', values='value').reset_index(drop=True)

这样处理后,你就能得到填充好搭档列的WEEK DataFrame了。

小提示

  • 如果你的姓名可能有大小写不一致的情况,可以先统一转成小写/大写再做匹配,比如register['NAME'] = register['NAME'].str.lower(),week[col] = week[col].str.lower()
  • 两种方法里,map更简单直接,适合大多数常规场景;merge更灵活,适合复杂的多列或需要额外处理的情况。

内容的提问来源于stack exchange,提问作者Oalvinegro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:36:34