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

Pandas混合数据类型列映射生成新列失败,求解决方法

解决Pandas入院编码映射NaN问题

你遇到的问题核心有两个:

  • 映射字典方向错误:map()需要的是「原数据值→目标分类」的键值对,你当前的字典是「分类→编码列表」,逻辑完全相反
  • 数据类型不匹配:ADMIMETH列是字符串类型(如'11'),但字典里的计划内编码是整数(如11),类型不一致导致无法匹配

以下是两种可行的解决方法:

方法1:重构映射字典(推荐)

将字典调整为「编码字符串→分类」的格式,统一所有编码为字符串类型,直接用map()完成匹配:

import pandas as pd

# 构建正确的映射关系,所有编码转为字符串
adm_mapping = {}
# 添加计划内编码
for code in [11, 12, 13]:
    adm_mapping[str(code)] = 'planned'
# 添加非计划内编码
for code in ['2A', '2B', '2C', '2D', 28, 31, 32, 21, 22, 23, 24, 25]:
    adm_mapping[str(code)] = 'non_planned'

df2 = pd.DataFrame({"ADMIMETH": ['11', '2D', '22']})
df2['pl_nonpl'] = df2['ADMIMETH'].map(adm_mapping)
print(df2)

运行结果:

ADMIMETH    pl_nonpl
0       11      planned
1       2D  non_planned
2       22  non_planned

方法2:用apply()结合条件判断

如果需要保留原字典结构,可以先统一编码类型,再通过apply()遍历判断:

import pandas as pd

adm_dictionary = {'planned': [11, 12, 13], 'non_planned': ['2A', '2B', '2C', '2D', 28, 31, 32, 21, 22, 23, 24, 25]}
# 把字典内的所有编码转为字符串,统一类型
planned_codes = [str(c) for c in adm_dictionary['planned']]
non_planned_codes = [str(c) for c in adm_dictionary['non_planned']]

df2 = pd.DataFrame({"ADMIMETH": ['11', '2D', '22']})

def classify_admission(code):
    if code in planned_codes:
        return 'planned'
    elif code in non_planned_codes:
        return 'non_planned'
    return None  # 处理不在编码范围内的情况

df2['pl_nonpl'] = df2['ADMIMETH'].apply(classify_admission)
print(df2)

此方法输出结果与方法1一致,适合需要保留原字典结构的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 15:52:15