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

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映射问题

问题原因分析

你碰到的两个问题其实是连锁反应:

  1. 结果变成浮点数:因为Pandas的整数类型(int64)无法存储NaN值,当map遇到字典中没有的键时会返回NaN,Pandas自动把列的 dtype 转为float64来容纳缺失值。
  2. 出现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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:09:59