如何按每个category的age取值范围对age列分别进行分箱
按类别单独分箱实现方案
你可以通过groupby+apply组合实现需求,核心逻辑是对每个category分组单独计算分箱阈值、执行分箱操作,再合并结果:
完整实现代码
基础版本(默认分组内age值不全相同)
import numpy as np import pandas as pd # 你原有的测试数据生成逻辑 df = pd.DataFrame({ 'age':np.random.choice( [12,15,17,95,13], 20), 'category':np.random.choice(['A','B','C', 'D'], 20) }) # 定义分组内分箱函数,n_bins为分箱数量,对应你原逻辑的10个区间 def bin_age_per_category(grp, n_bins=10): # 仅用当前分组的age极值生成bins bins = np.linspace(grp['age'].min(), grp['age'].max(), n_bins + 1) # 分箱结果存入新列,include_lowest避免最小值被遗漏 grp['age_bin'] = pd.cut(grp['age'], bins=bins, include_lowest=True) return grp # 按category分组应用分箱逻辑,group_keys=False避免生成多余多级索引 df = df.groupby('category', group_keys=False).apply(bin_age_per_category)
兼容异常版本(处理分组内age值全部相同的场景)
如果存在某个category下所有age值一致的情况,linspace会生成全部相同的阈值导致cut报错,可以加个判断兼容:
def bin_age_per_category(grp, n_bins=10): min_age = grp['age'].min() max_age = grp['age'].max() if min_age == max_age: # 单值场景统一分配到同一个区间 grp['age_bin'] = pd.Interval(left=min_age-0.1, right=max_age+0.1, closed='both') else: bins = np.linspace(min_age, max_age, n_bins + 1) grp['age_bin'] = pd.cut(grp['age'], bins=bins, include_lowest=True) return grp
分箱后分组统计
后续如果需要按类别+分箱做聚合统计,直接按两个字段分组即可:
# 示例:统计每个类别下每个分箱的记录数 bin_stats = df.groupby(['category', 'age_bin'], observed=True).size()
内容的提问来源于stack exchange,提问作者rubi
相关产品推荐
相关产品推荐

