如何根据Pandas DataFrame列值匹配字典值并返回对应键?
Pandas根据DataFrame列值匹配字典取值返回对应键的方法
问题描述
现有如下DataFrame和字典,需要新增col3列,根据col1的值是否存在于字典的取值列表中,返回对应的字典键(odd或even):
示例代码:
import pandas as pd import numpy as np df = pd.DataFrame({"col1": [1,2,3,4,5], "col2": [6,7,8,9,10]}) d = {"odd": [1,3,5,7,9], "even": [2,4,6,8,10]} # 原尝试写法有误,需修正 # df["col3"] = np.where(df["col1"].isin(d.values), d.key, "") # ???
期望得到的结果:
col1 col2 col3 0 1 6 odd 1 2 7 even 2 3 8 odd 3 4 9 even 4 5 10 odd
解决方案
方法1:构建反向映射字典(推荐,效率最高)
原字典是键→列表的结构,先转换成单个值→键的反向映射字典,再用map方法快速匹配:
# 构建值到键的反向映射 value_to_key = {} for key, values in d.items(): for val in values: value_to_key[val] = key # 生成col3列 df["col3"] = df["col1"].map(value_to_key)
该方法通过一次遍历构建映射,后续map操作为矢量化处理,适合大数据量场景。
方法2:使用apply函数(灵活但效率较低)
通过apply对col1的每个值遍历字典,匹配对应的键,适合数据量较小的场景:
# 用lambda结合next获取匹配键,未匹配则返回空字符串 df["col3"] = df["col1"].apply(lambda x: next((k for k, v in d.items() if x in v), ""))
方法3:嵌套np.where(适合字典键数量少的情况)
如果字典的键不多,可直接嵌套np.where逐个判断:
df["col3"] = np.where(df["col1"].isin(d["odd"]), "odd", np.where(df["col1"].isin(d["even"]), "even", ""))
该写法直观,但键数量多时会变得冗长。
内容的提问来源于stack exchange,提问作者AK91
相关产品推荐
相关产品推荐

