如何在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
相关产品推荐
相关产品推荐

