如何用Pandas计算固定窗口前10行均值并按指定索引提取结果
问题:按段计算前10个值的均值并保留指定索引行
我已经创建了示例DataFrame,需要计算每连续10个值的均值并将结果存入新列,其余行显示NaN。当前用以下代码得到了连续的滚动均值结果:
np.random.seed(42) sp= sorted(np.random.randint(0,200,55)) odo = sorted(np.random.randint(0,40,55)) df1 = pd.DataFrame({'sp':sp,'odo':odo}) # 获取10个值的滚动均值 df2 =df1.rolling(10).agg('mean') # 现在得到的是连续的滚动均值结果 # 我想要提取索引为9、19、29等位置的行,最终结果如下: df3 = df2[9::10]
预期输出结果为:
sp odo 9 17.7 2.9 19 56.2 8.2 29 89.1 15.4 39 120.7 23.4 49 167.9 30.7
解决方法
这里提供两种贴合需求的实现方式:
方法1:基于滚动均值筛选目标索引
你的现有代码已经能提取目标行,若要把结果合并回原DataFrame,让其余行显示NaN,只需用where方法过滤索引:
# 先计算10窗口的滚动均值 df_rolling = df1.rolling(10).mean() # 仅保留索引为9、19、29...的行值,其余设为NaN df1['sp_mean'] = df_rolling['sp'].where(df_rolling.index % 10 == 9) df1['odo_mean'] = df_rolling['odo'].where(df_rolling.index % 10 == 9)
方法2:按10行分段计算均值
如果需求是严格每10行一组计算均值(而非滚动),可以用groupby分组后映射结果:
# 按索引整除10分组,计算每组均值 grouped_mean = df1.groupby(df1.index // 10).mean() # 将均值赋值给每组最后一行(索引9、19...),其余行设为NaN df1['sp_mean'] = grouped_mean['sp'].reindex(df1.index // 10).where(df1.index % 10 == 9) df1['odo_mean'] = grouped_mean['odo'].reindex(df1.index // 10).where(df1.index % 10 == 9)
两种方法都能得到你想要的结果,按需选择即可。
内容的提问来源于stack exchange,提问作者Sushil Kokil
相关产品推荐
相关产品推荐

