You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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"],就算大小写匹配正确,列值也不会更新。
修复方案

二选一即可:

  1. 统一大小写后映射(推荐,不用修改原字典),直接把映射结果赋值给新列:
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)
  1. 修改字典键名,和bpstage列的大小写格式完全对齐,再做映射赋值:
bp_stages = {
    "Normal": "#aecd55",
    "Elevated": "#fcec4f",
    "Stage1": "#f4b93f",
    "Stage2": "#ad451d",
    "Crisis": "#8c1e1b",
}
df["bpcolor"] = df["bpstage"].map(bp_stages)

执行后得到的正确结果如下:

bpstagebpcolor
Normal#aecd55
Stage1#f4b93f
Elevated#fcec4f
Normal#aecd55

兜底提示:如果后续bpstage列可能出现字典未收录的取值,map会默认给对应行填充NaN,可以在map后链式调用.fillna("#自定义兜底颜色"),避免绘图时出现颜色缺失报错。

内容的提问来源于stack exchange,提问作者Robert Alexander

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 03:48:10