如何将值屏蔽逻辑应用到Pandas按每7行分组求均值的代码中?
如何在按固定行数分组求均值时排除特定无效值?
我来帮你解决这个问题!核心思路是先把需要排除的-9999和0转换成NaN(Pandas的均值计算会自动忽略NaN),再执行分组求均值的操作,这样就能完美结合你的屏蔽逻辑和分组需求。
修改后的完整代码
import pandas as pd import numpy as np # 读取指定列数据 df = pd.read_csv(e, sep='\t', usecols=[1], skiprows=(0), header=None) # 第一步:将需要排除的特定值替换为NaN df_clean = df.mask(df.isin([-9999, 0])) # 第二步:按每7行分组计算均值(自动忽略NaN) data_mean = df_clean.groupby(np.arange(len(df_clean)) // 7).mean() # 设置索引为从1开始的序号 data_mean.index = data_mean.index + 1 # 保存结果 data_mean.to_csv(outfile, sep="\t", header=False)
代码解释
- 屏蔽无效值:使用
mask()方法把df中等于-9999或0的元素替换为NaN,这样后续的均值计算会自动跳过这些无效值,不需要额外处理。 - 分组求均值:和你原来的分组逻辑一致,用
np.arange(len(df_clean)) // 7生成每7行一组的分组键,然后调用mean()时,Pandas会自动忽略每组内的NaN值,只计算有效数据的均值。 - 索引调整:保持你原来的逻辑,把分组索引从0开始改成从1开始,方便对应实际的组序号。
验证示例(用你提供的样本数据)
假设你的样本数据第2列内容为:567, 2, -9999, 3, 98, 4, 77, 5, 0, 6, 89, 7, 77, 8:
- 第一组(前7行)有效数据是
567,2,3,98,4,77,均值为(567+2+3+98+4+77)/6 ≈ 125.1667 - 第二组(后7行)有效数据是
5,6,89,7,77,8,均值为(5+6+89+7+77+8)/6 ≈ 32.0
运行修改后的代码就能得到这个结果,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Nat
相关产品推荐
相关产品推荐

