pandas如何按固定间隔位置计算DataFrame指定列的两类平均值
Pandas间隔取值计算双均值实现方案
原代码存在的基础问题
- pandas Series 求均值的内置方法为
.mean(),不存在.average()方法,直接调用会触发属性报错 - 硬编码切片区间
[0:5]、[1:4]仅能覆盖前10行数据,无法适配任意长度数据集,也实现不了每隔5位重复取值的逻辑 - 原测试数据代码存在语法错误,字典初始化后缺失右括号
核心实现逻辑
两个指标的取值可以通过位置索引对5取模的方式快速拆分,无需手动循环切片,不会出现取值遗漏或错算:
overload_average:筛选所有位置索引对5取模结果为0的行,即索引0、5、10……对应的值,计算均值baseline_average:筛选所有位置索引对5取模结果不为0的行,即每个overload取值点之后的4个值,对应索引1-4、6-9……区间,计算均值
纯Pandas实现代码
import pandas as pd # 初始化测试数据 data = pd.DataFrame({"strain":[12, 4, 5, 4, 1, 3, 2, 5, 10, 9]}) # 按取模规则筛选值计算均值 overload_average = data['strain'].iloc[lambda x: x.index % 5 == 0].mean() baseline_average = data['strain'].iloc[lambda x: x.index % 5 != 0].mean()
基于提供的测试数据计算结果:
overload_average取值为索引0的12、索引5的3,均值为7.5baseline_average取值为剩余8个值,均值为5.0
Numpy适配方案(超大数据集性能更优)
如果数据集规模较大,可以借助numpy生成位置掩码做筛选,逻辑和纯pandas版本一致,遍历开销更低:
import numpy as np # 生成从0开始的连续位置索引,避免原DataFrame索引不连续/非0起始导致的错误 pos_idx = np.arange(len(data)) overload_mask = pos_idx % 5 == 0 baseline_mask = ~overload_mask overload_average = data['strain'].iloc[overload_mask].mean() baseline_average = data['strain'].iloc[baseline_mask].mean()
注意事项
- 如果你的DataFrame索引不是从0开始的连续整数,不要直接使用
df.index %5做筛选,优先使用np.arange(len(df))生成位置索引,避免取值错位 - 取模逻辑天然适配末尾不足5个值的场景:比如数据长度为13时,索引10为overload取值点,索引11、12会自动被纳入baseline计算,不会出现数据遗漏
内容的提问来源于stack exchange,提问作者Murray Ross
相关产品推荐
相关产品推荐

