本文介绍在 Pandas 中,如何基于另一个数据框(含 ID→名称映射关系)高效地将主数据框中某列的整数列表(如 genre_ids)批量转换为对应字符串列表(如 ['Action', 'Adventure']),并提供简洁、安全、可扩展的实现方案。
本文介绍在 pandas 中,如何基于另一个数据框(含 id→名称映射关系)高效地将主数据框中某列的整数列表(如 `genre_ids`)批量转换为对应字符串列表(如 `['action', 'adventure']`),并提供简洁、安全、可扩展的实现方案。
在实际数据分析中,常遇到“ID 列表 → 名称列表”的映射需求:主数据框某列为嵌套列表(如电影类型 ID 列表),而另一张映射表(如 id → name)提供了 ID 的语义解释。此时需将 df1['genre_ids'] 中每个子列表内的数值,按 df2 中的对应关系逐一替换为字符串,并保持原始列表结构和顺序。
推荐采用字典映射 + apply 的组合方式,兼顾性能与可读性:
# 构建高效查找字典:id → name
mapping_dict = dict(zip(df2['id'], df2['name']))
# 对 genre_ids 列逐行处理:遍历每个列表,用字典安全获取对应名称
df1['genre_ids'] = df1['genre_ids'].apply(
lambda ids_list: [mapping_dict.get(id_val) for id_val in ids_list]
)
✅ 关键优势说明:
- dict(zip(...)) 时间复杂度为 O(n),查询为 O(1),远优于每次 df2.loc[df2['id']==x, 'name'].iloc[0] 的重复过滤;
- 使用 .get(id_val) 而非直接索引(如 mapping_dict[id_val]),可自动处理缺失 ID(返回 None),避免 KeyError;若需严格校验,可改用 mapping_dict[id_val] 并配合 df2.set_index('id')['name'].to_dict() 后添加异常捕获;
- 保留原始列表结构、顺序及嵌套层级,不展平、不去重。
⚠️ 注意事项:
- 确保 df2['id'] 无重复值,否则 zip 构造的字典会以最后出现的 name 为准(建议预先检查:df2['id'].duplicated().any());
- 若存在未覆盖的 ID(如 df1 中有 99 但 df2 未定义),.get() 返回 None,可统一替换为占位符:mapping_dict.get(id_val, 'Unknown');
- 对超大数据集(百万级行 × 长列表),可考虑使用 explode() + merge() + groupby().apply(list) 流水线,但通常字典方案已足够高效。
执行后,df1 即更新为预期格式:
title genre_ids 0 The Godfather [Action, Adventure] 1 Fight Club [Action] 2 The Empire [Adventure, Animation, Comedy]










