基于字典映射为DataFrame列赋值的实现求助
解决方案
实现思路
针对列C的每个值,按以下优先级匹配字典中的键:
- 精确匹配:检查值是否存在于字典某键对应的列表中
- 子串匹配:若精确匹配失败,检查值是否包含键名的子串(默认不区分大小写,可按需调整)
完整代码示例
import pandas as pd # 定义匹配规则字典 Sdiction = { "Mgage": ["ABC Gage", "XYZ Gage"], "Rate": ["deg/min", "rad/s", "rpm"] } # 读取CSV文件(替换为你的文件路径) df = pd.read_csv("your_input.csv") # 预构建值到键的映射,提升精确匹配效率 value_to_key = {v: key for key, values in Sdiction.items() for v in values} # 定义匹配函数 def match_key(c_str): # 优先精确匹配 if c_str in value_to_key: return value_to_key[c_str] # 子串匹配(不区分大小写) for key in Sdiction.keys(): if key.lower() in c_str.lower(): return key # 无匹配项时返回空值(可根据需求修改) return None # 生成列D df["列D"] = df["列C"].apply(match_key) # 输出结果(或保存为新CSV:df.to_csv("output.csv", index=False)) print(df)
测试验证
用你提供的示例输入测试:
# 模拟示例输入DataFrame df_test = pd.DataFrame({ "列A": [1, 2, 3], "列B": [30, 45, 150], "列C": ["ABC Gage", "deg/min", "Gage"], "列D": ["", "", ""] }) df_test["列D"] = df_test["列C"].apply(match_key) print(df_test)
输出结果与预期一致:
| 列A | 列B | 列C | 列D |
|---|---|---|---|
| 1 | 30 | ABC Gage | Mgage |
| 2 | 45 | deg/min | Rate |
| 3 | 150 | Gage | Mgage |
可选调整
- 如果需要区分大小写匹配子串,去掉
.lower()即可 - 若存在多个可能匹配的键,可修改逻辑返回第一个匹配项或所有匹配项(需调整函数返回值)
- 数据量较大时,可改用
np.vectorize替代apply提升性能
内容的提问来源于stack exchange,提问作者sqaseemali
相关产品推荐
相关产品推荐

