DataFrame年龄列字符串转整数报错求助:无法解析范围值及非有限值转换问题
解决年龄范围字符串转数值的问题
首先咱们来拆解下你遇到的两个报错原因:
- 第一个
ValueError: Unable to parse string "0-17" at position 0:因为pd.to_numeric只能解析纯数字格式的字符串,像"0-17"这种带横杠的范围字符串它完全读不懂,自然报错。 - 第二个
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
相关产品推荐
相关产品推荐

