如何按每N行分组处理DataFrame,使apply一次处理多行生成新聚合表
解决方案
核心思路是先生成每N行相同的分组标识,再通过groupby将整组多行数据传给处理逻辑,实现一次处理多行的需求。
步骤实现
1. 构造测试数据
import pandas as pd import numpy as np # 构造15行的测试DataFrame df = pd.DataFrame({ 'A': np.arange(15), 'B': np.arange(15)*2 })
2. 生成分组键
按每4行一组生成相同的分组ID,适配所有索引场景:
N = 4 # 每组行数 # 索引为连续整数时可以直接用索引整除N group_key = df.index // N # 如果索引不连续/非数字,替换为下面的代码 # group_key = np.arange(len(df)) // N
3. 自定义分组处理函数
groupby后的apply会把整组的多行子DataFrame作为入参传给该函数,你可以在函数内实现任意自定义处理逻辑:
def process_group(group): # group 是当前分组的全部行组成的子DataFrame return pd.Series({ 'sum(A)': group['A'].sum(), 'mean(B)': group['B'].mean() })
4. 执行分组处理
result = df.groupby(group_key).apply(process_group).reset_index(drop=True)
输出结果示例
以上代码运行后得到的结果如下:
| sum(A) | mean(B) |
|---|---|
| 6 | 3.0 |
| 22 | 11.0 |
| 38 | 19.0 |
| 39 | 26.0 |
优化提示
如果只是做简单的列聚合,不需要复杂自定义逻辑,直接用agg方法性能更高:
result = df.groupby(group_key).agg( sum_A=('A', 'sum'), mean_B=('B', 'mean') ).reset_index(drop=True)
内容的提问来源于stack exchange,提问作者27Sunny
相关产品推荐
相关产品推荐

