You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按每个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 22:06:04