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

DataFrame年龄列字符串转整数报错求助:无法解析范围值及非有限值转换问题

解决年龄范围字符串转数值的问题

首先咱们来拆解下你遇到的两个报错原因:

  1. 第一个ValueError: Unable to parse string "0-17" at position 0:因为pd.to_numeric只能解析纯数字格式的字符串,像"0-17"这种带横杠的范围字符串它完全读不懂,自然报错。
  2. 第二个ValueError: Cannot convert non-finite values (NA or inf) to integer:你用errors='coerce'时,pandas会把所有无法解析的字符串转换成NaN(虽然你说原DataFrame没有NA,但这是处理后新生成的),而普通的int类型无法存储NaN,所以转类型时失败。

下面给你几个实用的解决方案,根据你的建模需求选就行:

方案1:将年龄范围转换为数值代表值(推荐用于回归类模型)

把每个范围转换成平均值、左边界或右边界的数值,这样模型能直接用连续数值特征:

import pandas as pd

# 拆分年龄范围为最小/最大值两列
df[['Age_min', 'Age_max']] = df['Age'].str.split('-', expand=True).astype(int)

# 可选:用平均值作为年龄数值
df['Age'] = (df['Age_min'] + df['Age_max']) / 2

# 或者取左边界(比如"0-17"转成0)
# df['Age'] = df['Age_min']

# 或者取右边界(比如"0-17"转成17)
# df['Age'] = df['Age_max']

# 不需要的话可以删掉临时列
df.drop(['Age_min', 'Age_max'], axis=1, inplace=True)

方案2:将年龄范围映射为类别编码(推荐用于分类类模型)

如果年龄范围是类别特征,直接给每个范围分配一个整数标签:

# 手动创建映射字典(也可以自动生成)
age_range_map = {
    "0-17": 0,
    "18-30": 1,
    "31-50": 2,
    "51+": 3  # 如果有这种格式,需要单独处理,比如转成51或更大的数
}

df['Age'] = df['Age'].map(age_range_map)

# 或者用LabelEncoder自动编码(适合范围较多的情况)
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
df['Age'] = le.fit_transform(df['Age'])

方案3:使用可空整数类型(不推荐,除非你保留NaN有意义)

如果一定要用整数类型且保留无法解析的值(虽然你的场景里应该不需要),可以用pandas的可空整数类型Int64:

df['Age'] = pd.to_numeric(df['Age'], errors='coerce').astype('Int64')

这个方法会把"0-17"这类字符串转成NaN,但Int64类型允许存储NaN,不过对你的建模来说,这种缺失值可能没什么意义,所以还是前两个方案更实用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:19:45