Pandas如何依据另一DataFrame的映射关系替换指定列的对应值
实现方案
以下基于pandas实现,两种场景的代码均可直接运行:
单字段匹配(示例中ppid唯一匹配场景)
利用pandas的map方法实现,逻辑简单性能高:
import pandas as pd # 构造示例数据 df_X = pd.DataFrame({ 'ppid': ['id1', 'id2', 'id3'], 'col2': ['1', '2', '3'] }) df_map = pd.DataFrame({ 'ppid': ['id1', 'id2'], 'val': ['5', '6'] }) # 1. 生成映射字典 val_map = df_map.set_index('ppid')['val'] # 2. 匹配替换,匹配不到的保留原值 df_X['col2'] = df_X['ppid'].map(val_map).fillna(df_X['col2'])
运行后df_X的结果和预期完全一致。
多列联合匹配场景
如果是多个列共同作为唯一匹配键,使用左连接merge实现更方便:
# 假设匹配键为 ppid + 其他列 col_key,示例演示 df_X = pd.DataFrame({ 'ppid': ['id1', 'id2', 'id3', 'id1'], 'col_key': ['a', 'b', 'c', 'b'], 'col2': ['1', '2', '3', '4'] }) df_map = pd.DataFrame({ 'ppid': ['id1', 'id2', 'id1'], 'col_key': ['a', 'b', 'b'], 'val': ['5', '6', '7'] }) # 1. 左连接匹配,on参数传入所有需要联合匹配的列名 merged = df_X.merge(df_map, on=['ppid', 'col_key'], how='left') # 2. 替换col2,匹配不到的保留原值 merged['col2'] = merged['val'].fillna(merged['col2']) # 3. 删除多余的val列,得到最终结果 df_X = merged.drop('val', axis=1)
注意事项
- 匹配前需确保两个DataFrame中用于关联的键列数据类型完全一致,否则会出现匹配失败问题,比如字符串类型的
'1'和整数类型的1会被判定为不相等 - 若映射表中存在重复的关联键组合,需要提前做去重处理,避免左连接时出现行膨胀问题
内容的提问来源于stack exchange,提问作者Jjang
相关产品推荐
相关产品推荐

