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

如何基于Pandas现有代码实现重叠分箱的分组求和计算

重叠滑动分箱的奖项求和实现方案

可以直接在你现有代码逻辑的基础上修改实现,核心差异是:非重叠分箱用pd.cut只能让每个年龄归属1个分箱,重叠分箱需要让每个年龄匹配所有符合条件的滑动分箱,再拆分统计即可。

实现步骤

1. 自定义滑动分箱规则

首先定义你需要的滑动窗口参数,你示例中的(0-8岁)、(1-9岁)...对应窗口长度为9、滑动步长为1,可按需调整:

import pandas as pd

# 滑动窗口参数:窗口长度9,步长1
window_size = 9
step = 1
max_age = df['age'].max()

# 生成所有左闭右开的滑动分箱,和你原有规则的区间开闭逻辑一致
bin_starts = range(0, max_age - window_size + 2, step)
intervals = [pd.Interval(start, start + window_size, closed='left') for start in bin_starts]

2. 匹配多区间并拆分

给每条数据匹配所有符合的区间,再拆分为多行,保证每个归属的分箱都能参与统计:

# 给每个年龄匹配所有符合的区间
df = df.assign(age_interval=lambda x: x['age'].apply(lambda age: [i for i in intervals if age in i]))
# 拆分区间列,1条数据对应多个分箱的话会拆为多行
df_exploded = df.explode('age_interval', ignore_index=True)

3. 分组求和(兼容原有输出格式)

和你原有聚合逻辑一致,若需要保留原有输出里总和为0的区间组合,可补充全量匹配步骤:

# 基础聚合:按id和分箱求和奖项
df_out = df_exploded.groupby(['id', 'age_interval'], as_index=False)['awards'].sum().rename(columns={'awards': 'total_awards'})

# 可选:补充所有id和所有分箱的组合,将无数据的分箱奖项填充为0,和你原有输出格式完全对齐
all_id_bin = pd.MultiIndex.from_product([df['id'].unique(), intervals], names=['id', 'age_interval']).to_frame(index=False)
df_out = all_id_bin.merge(df_out, on=['id', 'age_interval'], how='left').fillna({'total_awards': 0}).astype({'total_awards': int})

# 可选:给每个id的分箱加序号,和你原有age_interval字段逻辑一致
df_out['age_interval'] = df_out.groupby('id').cumcount()

调整说明

  • 如需修改分箱规则,直接调整window_size(窗口长度)和step(滑动步长)即可适配其他重叠分箱需求
  • 区间开闭逻辑可通过pd.Interval的closed参数调整,可选值为left/right/both/neither

内容的提问来源于stack exchange,提问作者mrdatascience32

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 18:57:03