如何对pandas DataFrame数据按年龄区间分组以统计道路事故高发年龄段
问题解决方法
问题根源
- 年龄字段
V1_Edad为字符串类型,即使删除了明显非数值的行,也无法直接参与数值区间计算 - 仅定义了分箱规则(bins、labels),未实际将分箱规则应用到数据集上
- 原代码的分组逻辑是按单个年龄值计数,不是按自定义的年龄区间聚合
优化后完整代码
import pandas as pd import matplotlib.pyplot as plt # 1. 数据清洗:转换为数值类型,过滤无效值 # 将非数值内容转为NaN,删除NaN行,过滤年龄超过120的异常值 mty['V1_Edad'] = pd.to_numeric(mty['V1_Edad'], errors='coerce') mty = mty.dropna(subset=['V1_Edad']) mty = mty[(mty['V1_Edad'] >= 0) & (mty['V1_Edad'] <= 120)] # 2. 按自定义区间分箱 bins = [-1,15,40,60,80] labels = ['0-15', '16-40', '41-60', '61-80'] mty['age_group'] = pd.cut(mty['V1_Edad'], bins=bins, labels=labels) # 3. 统计各年龄区间事故数量 age_accident_count = mty['age_group'].value_counts().sort_index() print(age_accident_count) # 输出发生率最高的年龄段 print(f"事故发生率最高的年龄段为:{age_accident_count.idxmax()},事故数为:{age_accident_count.max()}") # 4. 可视化 plt.rcParams['font.sans-serif'] = ['SimHei'] # 解决中文显示问题 plt.bar(age_accident_count.index, age_accident_count.values) plt.xlabel('年龄区间') plt.ylabel('事故发生数量') plt.title('各年龄区间道路事故发生数统计') plt.show()
代码说明
pd.to_numeric的errors='coerce'参数会自动将无法转为数值的内容(比如之前残留的42|、sd等)转为空值,后续直接删除即可,不用手动筛选非数值行pd.cut是pandas专门用来做数值区间分箱的函数,会自动将每个年龄匹配到你定义的区间中,生成对应的分组标签- 最终统计结果
age_accident_count就是每个年龄区间对应的事故总数,可直接用于后续分析和绘图
内容的提问来源于stack exchange,提问作者asairi nava
相关产品推荐
相关产品推荐

