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
相关产品推荐
相关产品推荐

