Pandas根据字符串字典映射新增DataFrame列返回NaN问题排查
故障原因
映射返回NaN和字符串类型本身无关,是两个代码错误共同导致的:
- 键值大小写不匹配:你定义的
bp_stages字典所有键均为全小写格式(如"normal"、"stage1"),但DataFrame的bpstage列取值为首字母大写格式("Normal"、"Stage1"、"Elevated")。pandas.Series.map()是严格精确匹配,大小写差异会被判定为不同键,无法命中对应值。 - 未接收map的返回结果:
Series.map()是非原地操作,只会返回映射完成的新Series,不会修改原列数据。你写的df["bpcolor"].map(bp_stages)没有把运算结果赋值回df["bpcolor"],就算大小写匹配正确,列值也不会更新。
修复方案
二选一即可:
- 统一大小写后映射(推荐,不用修改原字典),直接把映射结果赋值给新列:
import pandas as pd df = pd.DataFrame({"bpstage": ["Normal", "Stage1", "Elevated", "Normal"]}) bp_stages = { "normal": "#aecd55", "elevated": "#fcec4f", "stage1": "#f4b93f", "stage2": "#ad451d", "crisis": "#8c1e1b", } # 将bpstage列统一转小写后匹配字典,结果直接赋值给bpcolor列 df["bpcolor"] = df["bpstage"].str.lower().map(bp_stages)
- 修改字典键名,和
bpstage列的大小写格式完全对齐,再做映射赋值:
bp_stages = { "Normal": "#aecd55", "Elevated": "#fcec4f", "Stage1": "#f4b93f", "Stage2": "#ad451d", "Crisis": "#8c1e1b", } df["bpcolor"] = df["bpstage"].map(bp_stages)
执行后得到的正确结果如下:
| bpstage | bpcolor |
|---|---|
| Normal | #aecd55 |
| Stage1 | #f4b93f |
| Elevated | #fcec4f |
| Normal | #aecd55 |
兜底提示:如果后续
bpstage列可能出现字典未收录的取值,map会默认给对应行填充NaN,可以在map后链式调用.fillna("#自定义兜底颜色"),避免绘图时出现颜色缺失报错。
内容的提问来源于stack exchange,提问作者Robert Alexander
相关产品推荐
相关产品推荐

