Python Pandas中将逗号分隔ID按映射表替换为对应值的实现方法
Pythonic 风格的 Pandas 实现方案
以下是两种常用的实现方式,分别适配不同的数据量场景:
1. 小数据量场景:简洁写法
核心逻辑是先将映射表转为字典,再对拆分后的ID列表做逐元素映射后拼接,可读性极高。
import pandas as pd # ---------------------- 示例数据构造 ---------------------- # 原表,id_str列为逗号分隔的ID字符串 df = pd.DataFrame({ "业务列": ["示例1", "示例2", "示例3"], "id_str": ["1,2,3", "2,4", "1,3,5"] }) # ID映射表 mapping_df = pd.DataFrame({ "id": ["1", "2", "3", "4"], "name": ["项目A", "项目B", "项目C", "项目D"] }) # ---------------------- 核心实现 ---------------------- # 1. 构建ID到名称的映射字典,保证ID类型和拆分后的ID类型一致(避免int/str类型不匹配导致映射失败) id_to_name = mapping_df.set_index("id")["name"].to_dict() # 2. 拆分ID列、映射、拼接 df["name_str"] = df["id_str"].str.split(",") \ .apply(lambda ids: ",".join([id_to_name.get(id_, f"未匹配:{id_}") for id_ in ids]))
dict.get() 方法用于处理未匹配到的ID,避免抛出KeyError,不需要可以直接写id_to_name[id_]
2. 大数据量场景:高性能向量化写法
避免apply的循环开销,用explode + 向量化映射 + 分组聚合实现,性能提升可达数倍到数十倍。
# 拆分ID到单独行 df_explode = df.assign(id=df["id_str"].str.split(",")).explode("id", ignore_index=False) # 向量化映射 df_explode["name"] = df_explode["id"].map(id_to_name) # 按原索引分组聚合,拼接名称 df = df_explode.groupby(level=0).agg( 业务列=("业务列", "first"), id_str=("id_str", "first"), name_str=("name", ",".join) ).reset_index(drop=True)
内容的提问来源于stack exchange,提问作者Sriram Arvind Lakshmanakumar
相关产品推荐
相关产品推荐

