如何将DataFrame列值与字典列表值进行存在性匹配?
解决方案:判断DataFrame列值是否存在于映射字典的列表中
这里有个高效简洁的方案来实现你想要的功能,核心思路是先把映射字典里的所有目标值整合到一个集合(查找效率更高),再用pandas内置方法批量判断:
完整代码示例
import pandas as pd from itertools import chain # 可选,用来简化代码 # 你的原始数据 d = {'col1':['2q','48', '48-49']} test = pd.DataFrame(d) # 映射字典 mupcs_to_pc_mapping = { '24': ['48-49', '48', '49'], #M2 '23': ['50-51', '50', '51'], #M3 '22': ['52-53', '52', '53'], #M4 '21': ['54-55', '54', '55'], #M5 } # 方法1:用itertools.chain合并所有子列表元素为集合(简洁写法) all_target_values = set(chain.from_iterable(mupcs_to_pc_mapping.values())) # 方法2:手动循环合并(适合不想导入额外库的场景) # all_target_values = set() # for value_list in mupcs_to_pc_mapping.values(): # all_target_values.update(value_list) # 批量判断每个col1的值是否在目标集合中 test['exists_in_mapping'] = test['col1'].isin(all_target_values) # 输出你需要的结果列 print(test['exists_in_mapping'])
运行结果
0 False 1 True 2 True Name: exists_in_mapping, dtype: bool
关键细节说明
- 集合的优势:把所有目标值存入集合,是因为集合的成员检测操作
x in s时间复杂度为O(1),远快于列表的O(n),当映射字典规模较大时,效率提升会非常明显。 - isin()方法:pandas的
Series.isin()是专门用于批量判断元素是否在目标序列/集合中的内置方法,比手动循环遍历每个元素简洁且高效。
如果你之前尝试相关方法没成功,大概率是因为没有正确提取映射字典里所有子列表的元素,而是仅针对单一列表做判断,导致检测范围不对。
内容的提问来源于stack exchange,提问作者Tony
相关产品推荐
相关产品推荐

