Python字符串转整数方法及Pandas映射浮点数、NaN问题的解决咨询
Python字符串映射为整数的方法及Pandas问题解决
一、通用Python中字符串转整数的方法
日常处理字符串到整数的映射,常用这几种灵活的方式:
- 字典直接映射:适合已知所有类别且数量不多的场景,用字典键值对直接对应,还可以用
get方法处理未匹配的情况,避免报错:str_map = {'集体企业人员':0, '在岗职工':1, '农电工':2} # 映射单个字符串,未匹配返回默认值-1 num = str_map.get('未知人员', -1) - 枚举唯一值自动映射:如果类别较多或不确定,先提取唯一字符串再分配整数,省得手动写字典:
unique_strings = ['集体企业人员', '在岗职工', '农电工', '其他'] str_map = {s: idx for idx, s in enumerate(unique_strings)} - 自定义函数映射:针对复杂逻辑(比如带条件的映射),可以写个函数配合
map使用:def str_to_int(s): if s.startswith('集体'): return 0 elif s == '在岗职工': return 1 elif s == '农电工': return 2 else: return 3 num = str_to_int('集体企业人员')
二、解决你遇到的Pandas映射问题
问题原因分析
你碰到的两个问题其实是连锁反应:
- 结果变成浮点数:因为Pandas的整数类型(
int64)无法存储NaN值,当map遇到字典中没有的键时会返回NaN,Pandas自动把列的 dtype 转为float64来容纳缺失值。 - 出现NaN:说明这些行的
post值不在你定义的字典键里,大概率是存在未考虑到的类别,或者字符串有隐藏字符(比如前后空格、全角/半角差异)。
分步解决方案
1. 先排查未匹配的类别
先找出所有不匹配的字符串,确认问题根源:
# 获取post列的所有唯一值 all_posts = data2['post'].unique() # 筛选出不在映射字典里的值 unmatched_posts = [p for p in all_posts if p not in {'集体企业人员', '在岗职工', '农电工'}] print("未匹配的岗位类别:", unmatched_posts)
如果输出结果里有值,比如['退休人员', '在岗职工 '](注意第二个带空格),就需要先清洗数据或者补充映射。
2. 数据清洗(处理字符异常)
如果是字符串有空格或格式问题,先做清洗:
# 去掉字符串前后的空格 data2['post'] = data2['post'].str.strip() # 统一转为全角/半角(如果存在格式差异) data2['post'] = data2['post'].str.normalize('NFKC')
3. 正确映射并转为整数
有两种可靠的方式:
方式一:用map+fillna+astype
给未匹配的值指定默认整数,再强制转为整数类型:
post_map = {'集体企业人员':0, '在岗职工':1, '农电工':2} # 映射后填充未匹配的值为3,再转整数 data2['post'] = data2['post'].map(post_map).fillna(3).astype(int)
方式二:用pd.Categorical(更适合分类变量)
将列转为分类类型,自动生成整数编码,还能统一处理未匹配的类别:
# 指定所有可能的类别,最后一个是未匹配的"其他" data2['post'] = pd.Categorical( data2['post'], categories=['集体企业人员', '在岗职工', '农电工', '其他'], ordered=False ) # 获取分类对应的整数编码 data2['post'] = data2['post'].cat.codes
这种方式下,不在前三个类别里的都会被编码为3,且结果是整数类型,不会出现浮点数。
方式三:用replace方法
replace不会返回NaN(除非你指定),直接替换所有匹配的值,未匹配的可以统一处理:
# 先补充未匹配类别的映射 full_map = { '集体企业人员':0, '在岗职工':1, '农电工':2, **{p:3 for p in unmatched_posts} # 把未匹配的都映射为3 } data2['post'] = data2['post'].replace(full_map).astype(int)
内容的提问来源于stack exchange,提问作者littlely
相关产品推荐
相关产品推荐

