如何用Pandas实现分组列的逐行累积均值计算?
自动化生成分组列的逐行累积均值方法
问题场景
有如下Pandas数据集,列分为a和b两组,每组包含4个序列列:
import pandas as pd data = [[1, 4, 6, 10, 15, 40, 90, 100], [2, 5, 3, 11, 25, 50, 90, 120], [3, 7, 9, 14, 35, 55, 100, 120]] df = pd.DataFrame(data, columns=['a1', 'a2', 'a3', 'a4', 'b1', 'b2', 'b3', 'b4'])
数据集预览:
a1 a2 a3 a4 b1 b2 b3 b4 0 1 4 6 10 15 40 90 100 1 2 5 3 11 25 50 90 120 2 3 7 9 14 35 55 100 120
需要为每组生成逐行累积均值列:
- 对
a组:生成a1_2(a1+a2的均值)、a1_3(a1+a2+a3的均值)、a1_4(a1到a4的均值) - 对
b组:生成b1_2、b1_3、b1_4,规则同上
手动逐个计算效率低下,需要自动化实现方式。
自动化实现方案
可以通过分组处理+累积计算批量生成目标列,具体代码如下:
import pandas as pd data = [[1, 4, 6, 10, 15, 40, 90, 100], [2, 5, 3, 11, 25, 50, 90, 120], [3, 7, 9, 14, 35, 55, 100, 120]] df = pd.DataFrame(data, columns=['a1', 'a2', 'a3', 'a4', 'b1', 'b2', 'b3', 'b4']) # 提取列名前缀作为分组标识 groups = df.columns.str.extract('([ab])', expand=False).unique() for group in groups: # 获取当前组的所有列,并按序号排序 group_cols = sorted([col for col in df.columns if col.startswith(group)], key=lambda x: int(x[1:])) # 计算逐行累积和,再除以对应累积列数得到均值 cumulative_means = df[group_cols].cumsum(axis=1) / range(1, len(group_cols)+1) # 重命名列以匹配需求格式 cumulative_means.columns = [f"{group}1_{i}" for i in range(2, len(group_cols)+1)] # 将新列合并到原DataFrame df = pd.concat([df, cumulative_means], axis=1) print(df)
运行后输出结果:
a1 a2 a3 a4 b1 b2 b3 b4 a1_2 a1_3 a1_4 b1_2 b1_3 b1_4 0 1 4 6 10 15 40 90 100 2.5 3.666667 5.25 27.5 48.333333 61.25 1 2 5 3 11 25 50 90 120 3.5 3.333333 5.25 37.5 55.000000 71.25 2 3 7 9 14 35 55 100 120 5.0 6.333333 8.25 45.0 63.333333 77.50
代码说明
df.columns.str.extract('([ab])', expand=False).unique():提取列名的前缀分组标识(此处为a和b)sorted(..., key=lambda x: int(x[1:])):确保组内列按序号从小到大排列,避免列名乱序导致计算错误cumsum(axis=1):按行计算累积和,再除以range(1, len(group_cols)+1)直接得到逐行累积均值pd.concat:将新生成的累积均值列合并到原DataFrame,完成批量处理
内容的提问来源于stack exchange,提问作者Quinten
相关产品推荐
相关产品推荐

