如何在Pandas中按年份子集对数据行进行分箱与分类?
按年份子集对苏格兰犯罪数据集分箱的解决方案
核心思路
按date_start提取的年份分组,对每个年份的count_per_10k数据单独计算分箱区间(基于该年份自身的数值范围),再用pd.cut分成8个类别,确保每个年份的分箱适配自身数据分布,而非用全数据集的统一区间。
具体步骤&代码
- 处理日期列(若未转为datetime格式)
import pandas as pd import numpy as np # 将date_start转为datetime类型 df['date_start'] = pd.to_datetime(df['date_start']) # 提取年份列,方便后续分组操作 df['year'] = df['date_start'].dt.year
- 定义分箱函数
该函数会针对每个年份组单独计算分箱边界,生成8个等分区间:
def bin_yearly_data(group): # 获取当前年份组count_per_10k的最小、最大值 val_min = group['count_per_10k'].min() val_max = group['count_per_10k'].max() # 生成8个箱的边界(8个箱需要9个分界点) bins = np.linspace(val_min, val_max, num=9) # 执行分箱,添加新列存储分类结果,同时确保最小值被包含在第一个箱中 group['count_bin'] = pd.cut( group['count_per_10k'], bins=bins, labels=[f"第{i+1}类" for i in range(8)], include_lowest=True ) return group
- 按年份分组应用分箱逻辑
# 按年份分组,对每个组执行分箱操作 df_binned = df.groupby('year').apply(bin_yearly_data)
关键说明
- 每个年份的分箱区间独立计算,不受其他年份数据干扰,能更精准反映当年
count_per_10k的分布情况 - 若无需自定义标签,可去掉
labels参数,count_bin列会直接显示区间字符串(如(0.2, 1.5]) include_lowest=True用于避免最小值因浮点精度问题落在第一个区间之外
内容的提问来源于stack exchange,提问作者Flim Springfield
相关产品推荐
相关产品推荐

