如何在Pandas中按字典列表值匹配替换DataFrame列值?
问题描述
已知有类似问题讨论,但仍需解决以下场景:当DataFrame中Col列的取值存在于某个字典的列表型值中时,用字典对应的键替换该列值。
示例数据
import pandas as pd df = pd.DataFrame({"Col": ["Apple", "Appy", "aple","Banana", "Banaa", "Banananan", "Carrot", "Mango", "Pineapple"]})
remap_dict = {"Apple": ["Appy", "aple"], "Banana": ["Banaa", "Banananan"]}
直接使用Pandas的replace方法无法处理值为列表的字典:
df["Col"].replace(remap_dict, regex=True)
需要实现的效果是:将Col列中属于字典列表值的元素,替换为对应的字典键,其余值保持不变。
期望输出
Col 0 Apple 1 Apple 2 Apple 3 Banana 4 Banana 5 Banana 6 Carrot 7 Mango 8 Pineapple
解决方案
方法1:反转字典结构后使用replace
先把原字典反转,生成{别名: 目标值}的结构,这样就能直接用replace方法处理:
# 反转字典,将列表中的每个别名映射到对应键 reverse_dict = {alias: key for key, aliases in remap_dict.items() for alias in aliases} # 执行替换操作 df["Col"] = df["Col"].replace(reverse_dict)
执行后,Col列中属于reverse_dict键的元素会被替换为对应的值,其余元素保持原样,完全符合需求。
方法2:使用map结合get方法
基于反转后的字典,用map配合get方法,指定默认值为原元素,实现映射替换:
reverse_dict = {alias: key for key, aliases in remap_dict.items() for alias in aliases} df["Col"] = df["Col"].map(lambda x: reverse_dict.get(x, x))
这种方法和方法1效果一致,若后续需要扩展映射逻辑,调整lambda表达式即可。
内容的提问来源于stack exchange,提问作者Ailurophile
相关产品推荐
相关产品推荐

