Pandas按多字段分组后对day列分箱并计算分箱内amount均值的实现问题
实现方案
思路:由于不同分组的day范围存在差异,需要在按code1、code2、code3分组后,对每个分组单独生成适配当前组day范围的分箱,再计算每个分箱的amount平均值,最后格式化分箱展示样式即可。
完整代码实现
import pandas as pd import numpy as np # 自定义分组处理逻辑 def process_group(group, bin_count=7): # 获取当前分组的day范围,生成分箱边界 min_day = group['day'].min() max_day = group['day'].max() # 生成等宽分箱边界,bin_count为分箱总数,可自行调整 bins = np.linspace(min_day, max_day, bin_count + 1, dtype=int) # 生成要求格式的分箱标签:[x-y] bin_labels = [f"[{bins[i]}-{bins[i+1]}]" for i in range(len(bins)-1)] # 对当前分组的day进行分箱 group['day_bin'] = pd.cut( group['day'], bins=bins, labels=bin_labels, include_lowest=True ) # 按分箱分组计算amount平均值,保留分组标识字段 group_res = group.groupby('day_bin', as_index=False).agg( code1 = ('code1', 'first'), code2 = ('code2', 'first'), code3 = ('code3', 'first'), amount = ('amount', 'mean') ).rename(columns={'day_bin': 'day'}) return group_res # 对原始数据按三个code字段分组,应用处理逻辑 result_df = df.groupby( ['code1', 'code2', 'code3'], as_index=False ).apply(process_group).reset_index(drop=True) # 调整列顺序匹配期望输出 result_df = result_df[['code1', 'code2', 'code3', 'day', 'amount']]
可选调整说明
- 如果需要固定步长分箱(比如每3天一个箱),可以替换分箱边界生成逻辑:
# 步长为3的分箱边界生成方式 bins = np.arange(min_day, max_day + 3, 3, dtype=int) - 如果需要amount输出为整数,可以修改agg中amount的计算逻辑:
amount = ('amount', lambda x: round(x.mean()))
内容的提问来源于stack exchange,提问作者David Hernandez
相关产品推荐
相关产品推荐

