如何对pandas groupby分组结果应用累积扩展窗口计算
实现方案
你的需求本质是按G列分组的出现顺序做累加扩展窗口,每次计算包含当前分组及之前所有分组的全部原始行数据,可直接按以下逻辑实现:
完整代码示例
import pandas as pd # 1. 构造示例数据 df = pd.DataFrame({ 'G': ['A', 'A', 'A', 'B', 'B', 'C', 'C', 'C'], 'Val': [0, 1, 2, 3, 4, 5, 6, 7] }) # 2. 获取分组的顺序(按数据中首次出现的顺序,可手动替换为自定义顺序列表) group_order = df['G'].unique() # 3. 自定义计算函数,可直接操作传入的所有原始数据 def your_custom_func(data_series): # 示例1:求和 # return data_series.sum() # 示例2:求均值 return data_series.mean() # 自定义逻辑直接在这里写即可,可访问所有传入的原始条目 # 4. 遍历计算每个分组的结果 result = [] for idx, group in enumerate(group_order): # 取当前及之前所有分组的全部Val列数据,需要整行数据的话去掉['Val']即可 current_all_data = df[df['G'].isin(group_order[:idx+1])]['Val'] result.append([group, your_custom_func(current_all_data)]) # 5. 转成DataFrame格式输出 result_df = pd.DataFrame(result, columns=['G', '计算结果']) print(result_df)
输出验证
- 用求和函数时输出:
G 计算结果 0 A 3 1 B 10 2 C 28
- 用求均值函数时输出:
G 计算结果 0 A 1.0 1 B 2.0 2 C 3.5
注意事项
- 如果需要自定义分组的先后顺序,直接把
group_order变量替换为你指定的列表即可,比如group_order = ['C', 'B', 'A'] - 如果自定义函数需要访问整行的所有字段,把
current_all_data = df[df['G'].isin(group_order[:idx+1])]['Val']中的['Val']删掉,函数接收的就是符合条件的完整子数据框,可以自由操作所有列的原始值。
内容的提问来源于stack exchange,提问作者divingTobi
相关产品推荐
相关产品推荐

