如何将年龄数据分箱为指定类别?解决pd.cut()的边界唯一错误
年龄分箱问题的解决方案
1. 先将年龄列转为数值类型
你之前替换缺失值后,F1: AGE列大概率还是object字符串类型,这会导致pd.cut无法正常工作,先转成数值型:
# 转换为数值,无法转换的自动设为NaN df['F1: AGE'] = pd.to_numeric(df['F1: AGE'], errors='coerce')
2. 定义分箱边界与标签
按照需求设置唯一的边界区间,覆盖所有可能的年龄值:
- 边界:
[-float('inf'), 17, 25, 35, 45, 55, float('inf')] - 对应标签:
['17岁及以下', '18-25岁', '26-35岁', '36-45岁', '46-55岁', '56岁以上']
3. 执行分箱并处理缺失值
用pd.cut完成分箱后,将缺失值(NaN)替换为「未知」:
# 设置分箱参数 bins = [-float('inf'), 17, 25, 35, 45, 55, float('inf')] labels = ['17岁及以下', '18-25岁', '26-35岁', '36-45岁', '46-55岁', '56岁以上'] # 执行分箱,include_lowest=True确保17岁及以下的边界包含17 df['年龄分组'] = pd.cut(df['F1: AGE'], bins=bins, labels=labels, include_lowest=True) # 将NaN替换为「未知」 df['年龄分组'] = df['年龄分组'].fillna('未知')
报错原因说明
你遇到的Bin edges must be unique错误,通常是两个原因:
- 年龄列不是数值类型,
pd.cut无法识别边界逻辑 - 手动设置的边界存在重复值(比如重复写了同一个数字)
完整可运行代码
import pandas as pd import numpy as np # 你的初始处理代码 age_index = df['F1: AGE'].str.isnumeric() age_index = age_index.fillna(False) df.loc[~age_index, 'F1: AGE'] = np.nan # 转换为数值类型 df['F1: AGE'] = pd.to_numeric(df['F1: AGE'], errors='coerce') # 分箱生成分组 bins = [-float('inf'), 17, 25, 35, 45, 55, float('inf')] labels = ['17岁及以下', '18-25岁', '26-35岁', '36-45岁', '46-55岁', '56岁以上'] df['年龄分组'] = pd.cut(df['F1: AGE'], bins=bins, labels=labels, include_lowest=True) df['年龄分组'] = df['年龄分组'].fillna('未知')
内容的提问来源于stack exchange,提问作者drizzlesworld
相关产品推荐
相关产品推荐

