如何在Pandas中实现类VLOOKUP功能:基于列匹配生成新列值
用Python实现类似Excel VLOOKUP的匹配赋值需求
需求:当analysis_sheet的GPN列值存在于whitelist_sheet的GPN列时,将whitelist_sheet对应行的SOURCE列值写入analysis_sheet的RCL列。
尝试过的无效代码及问题
- 代码1:
analysis_sheet['RCL'] = analysis_sheet['GPN'].isin(whitelist_sheet['GPN'])
仅返回布尔值(True/False),无法获取对应的SOURCE列内容。
- 代码2:
analysis_sheet['RCL'] = ((analysis_sheet['GPN'].loc[analysis_sheet['GPN'].isin(whitelist_sheet['GPN']), analysis_sheet['RCL']]) = whitelist_sheet['SOURCE'])
存在语法错误,赋值语句不能嵌套在表达式中,且直接赋值整列SOURCE会导致索引不匹配。
- 代码3:
analysis_sheet['RCL'] = analysis_sheet.merge(whitelist_sheet, right_on='SOURCE')
merge会返回完整的合并DataFrame,无法直接赋值给单个列,且匹配键错误(应使用GPN而非SOURCE)。
- 代码4:
analysis_sheet['RCL'] = analysis_sheet.loc[analysis_sheet['GPN'].isin(whitelist_sheet['GPN']), whitelist_sheet['SOURCE']]
两个DataFrame的索引不匹配,无法完成对应位置的赋值。
正确实现方法
方法1:字典映射+map(高效简洁)
先构建GPN到SOURCE的映射关系,再批量匹配赋值:
# 生成GPN与SOURCE的映射字典 gpn_source_map = whitelist_sheet.set_index('GPN')['SOURCE'].to_dict() # 匹配赋值,不存在的GPN会填充NaN analysis_sheet['RCL'] = analysis_sheet['GPN'].map(gpn_source_map)
方法2:左连接合并(保留原表结构)
通过merge左连接合并两表,提取对应列赋值:
# 仅保留需要的列进行左连接,避免冗余数据 merged_data = analysis_sheet.merge(whitelist_sheet[['GPN', 'SOURCE']], on='GPN', how='left') # 将合并后的SOURCE列赋值给RCL analysis_sheet['RCL'] = merged_data['SOURCE']
方法3:loc筛选+replace(适合小型数据集)
# 初始化RCL列为空值 analysis_sheet['RCL'] = pd.NA # 筛选出匹配GPN的行,替换为对应SOURCE值 match_rows = analysis_sheet['GPN'].isin(whitelist_sheet['GPN']) analysis_sheet.loc[match_rows, 'RCL'] = analysis_sheet.loc[match_rows, 'GPN'].replace(gpn_source_map)
内容的提问来源于stack exchange,提问作者Karolina
相关产品推荐
相关产品推荐

