如何使用Pandas按sub和window分组计算mean、stdev、rms的平均值?
解决方法:用Pandas分组聚合计算每组均值
这需求用Pandas的groupby配合聚合操作就能完美解决,刚好能处理不同受试者同一窗口行数不一的情况,我给你一步步拆解:
核心思路
我们需要先按**受试者(sub列)和窗口(window列)**的组合来分组,然后对每个分组里的mean、stdev、rms三列分别计算平均值——Pandas会自动忽略每组行数的差异,只针对组内数据计算。
具体代码
假设你的DataFrame名叫df,直接运行下面的代码即可:
# 按sub和window分组,计算指定列的平均值 result_df = df.groupby(['sub', 'window'])[['mean', 'stdev', 'rms']].mean().reset_index()
代码解释
groupby(['sub', 'window']):把数据按「受试者+窗口」的唯一组合分成一个个独立的小组,比如S03的窗口1是一组,S26的窗口5是另一组。[['mean', 'stdev', 'rms']]:明确指定只对这三列做聚合操作,避免处理其他无关列。.mean():对每个分组内的指定列分别计算平均值,不管该组有6行还是15行,结果都是组内数据的均值。.reset_index():把原本作为分组索引的sub和window变回普通列,方便后续查看、导出或进一步处理。
示例效果
举个简单例子,假设你的原始数据是这样的:
| sub | window | mean | stdev | rms |
|---|---|---|---|---|
| S03 | 1 | 2.5 | 0.8 | 3.1 |
| S03 | 1 | 3.0 | 0.7 | 3.2 |
| S03 | 2 | 4.1 | 1.0 | 4.3 |
| S26 | 1 | 1.8 | 0.5 | 2.0 |
运行代码后得到的结果result_df会是:
| sub | window | mean | stdev | rms |
|---|---|---|---|---|
| S03 | 1 | 2.75 | 0.75 | 3.15 |
| S03 | 2 | 4.1 | 1.0 | 4.3 |
| S26 | 1 | 1.8 | 0.5 | 2.0 |
扩展:计算多个统计量
如果之后需要同时计算更多统计量(比如中位数、最大值),可以用.agg()方法灵活配置:
# 同时计算均值和中位数 result_df = df.groupby(['sub', 'window'])[['mean', 'stdev', 'rms']].agg(['mean', 'median']).reset_index()
内容的提问来源于stack exchange,提问作者CentauriAurelius
相关产品推荐
相关产品推荐

