Python年龄分箱报错求助:Bin labels must be one fewer than bin edges
解决
pd.cut报错Bin labels must be one fewer than the number of bin edges的问题 报错原因
核心问题是**pd.cut的区间边界数与标签数不匹配**:你定义的bins有7个边界值([-inf,17,25,35,45,55,inf]),会划分出6个连续区间,但你给了7个labels——其中unknown不属于区间标签,是用来处理缺失/非数值的特殊分类,这直接违反了pd.cut的规则:标签数必须比区间边界数少1。
修正方案
把unknown从pd.cut的labels中移除,仅保留年龄区间对应的标签;先用pd.cut处理有效数值的分类,再单独将缺失值替换为unknown,最后设置指定的分类顺序。
完整修正代码
import pandas as pd import numpy as np # 预处理:将非数值数据转为缺失值 age_index = candy['Q3: AGE'].str.isnumeric() age_index = age_index.fillna(False) candy.loc[~age_index, 'Q3: AGE'] = np.nan # 定义正确的区间边界和对应标签(标签数=边界数-1) bins = [-float('inf'), 17, 25, 35, 45, 55, float('inf')] labels = ['17 and under', '18-25', '26-35', '36-45', '46-55', '56+'] # 用pd.cut处理有效数值,缺失值自动转为NaN candy['age_cat'] = pd.cut( pd.to_numeric(candy['Q3: AGE'], errors='coerce'), bins=bins, labels=labels, include_lowest=True ) # 将缺失值替换为unknown candy['age_cat'].fillna('unknown', inplace=True) # 设置指定顺序的分类类型 candy['age_cat'] = pd.Categorical( candy['age_cat'], categories=['unknown', '17 and under', '18-25', '26-35', '36-45', '46-55', '56+'], ordered=False ) print(candy['age_cat'])
关键说明
pd.cut仅负责将有效数值映射到对应年龄区间,unknown是单独处理缺失/非数值的分类,不能混入区间标签- 预处理阶段已将非数值转为缺失值,
pd.cut遇到缺失值会生成NaN,后续通过fillna统一替换为unknown - 最后用
pd.Categorical强制指定分类顺序,满足unknown排在首位的要求
内容的提问来源于stack exchange,提问作者john.clay24
相关产品推荐
相关产品推荐

