Pandas年龄列混存字符串整数 分桶时报str与int比较类型错误
报错根因
你当前DataFrame的age列存储的是区间类字符串值(比如20 or younger、26 30这类),不是单个整数年龄,列数据类型为字符串型(object)。原age_buckets函数的逻辑是将输入值和整数做大小比较,字符串和整数无法直接做<运算,因此触发TypeError。
你现有age列的原始取值及对应计数整理如下:
- 20 or younger:14条
- 61 or older:45条
- 56-60:34条
- 31-35:30条
- 56 or older:31条
- 21-25:23条
- 26 30:56条(连字符缺失,实际为26-30区间)
- 31 35:44条(连字符缺失,实际为31-35区间)
- 36 40:32条(连字符缺失,实际为36-40区间)
- 21 25:26条(连字符缺失,实际为21-25区间)
- 26-30:14条
- 46 50:14条(连字符缺失,实际为46-50区间)
- 36-40:15条
- 46-50:33条
- 41 45:24条(连字符缺失,实际为41-45区间)
- 41-45:29条
- 51-55:35条
解决方案
针对当前字符串格式的年龄区间数据,不需要提取单个年龄值,直接做格式归一化+映射匹配即可完成分桶,代码可直接复用:
import pandas as pd # 定义原始年龄区间到目标标准分桶的映射规则 age_mapping = { "20 or younger": "18-29", "21-25": "18-29", "26-30": "18-29", "31-35": "30-39", "36-40": "30-39", "41-45": "40-49", "46-50": "40-49", "51-55": "50-59", "56-60": "50-59", "56 or older": "50-59", "61 or older": "60-69" } # 统一区间格式:把空格分隔的区间替换为横杠连接,再把带or的描述还原 df["age_temp"] = df["age"].str.replace(r"\s+", "-", regex=True) df["age_temp"] = df["age_temp"].str.replace("-or-", " or ") # 映射得到标准分桶,未匹配到的内容归为other df["age_bucket"] = df["age_temp"].map(age_mapping).fillna("other") # 用完可以删除临时列 df = df.drop(columns=["age_temp"])
补充:如果后续你拿到的
age列是单个年龄数值,原来写的age_buckets函数可以正常使用,只要提前把列转为数值类型即可:df["age"] = pd.to_numeric(df["age"], errors="coerce"),转完类型再应用函数就不会触发类型错误。
内容的提问来源于stack exchange,提问作者eddie
相关产品推荐
相关产品推荐

