如何基于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
相关产品推荐
相关产品推荐

