You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于最近n个非空值计算列的可变区间移动平均?

问题描述

我有如下格式的DataFrame:

日期时间数值移动平均(MA)
1 Jan1None
2 Jan2None
3 Jan1None
4 JanN/ANone
5 Jan2None
6 JanN/ANone
7 JanN/ANone
8 Jan3None

需要计算「数值」列基于最近3个非空值的移动平均,期望输出如下:

日期时间数值移动平均(MA)
1 Jan11
2 Jan21.5
3 Jan11.33
4 JanNone1.33
5 Jan21.67
6 JanNone1.67
7 JanNone1.67
8 Jan32

注意:常规的rolling.mean()无法满足需求(它基于窗口位置而非非空值数量),且DataFrame数据量庞大,需避免循环,寻求最优解决方案。

解决方案

通过以下向量化步骤实现高效计算:

  1. 统一缺失值格式,让pandas正确识别:
import pandas as pd

# 将字符串N/A替换为pandas标准缺失值
df = df.replace('N/A', pd.NA)
  1. 针对非空值计算滚动统计量:
# 提取非空数值并保留原始索引
non_null_vals = df['数值'].dropna()

# 计算最近3个非空值的滚动和(不足3个时取现有值)
rolling_sum = non_null_vals.rolling(window=3, min_periods=1).sum()
# 计算最近3个非空值的滚动计数
rolling_count = non_null_vals.rolling(window=3, min_periods=1).count()

# 得到非空位置的移动平均值
ma_non_null = rolling_sum / rolling_count
  1. 将结果映射回原DataFrame并填充空值行:
# 将计算结果对齐到原索引,空值位置用前向填充
df['移动平均(MA)'] = ma_non_null.reindex(df.index).ffill()

# 可选:保留两位小数匹配期望输出格式
df['移动平均(MA)'] = df['移动平均(MA)'].round(2)

全程使用pandas内置向量化操作,无循环,处理大规模数据效率极高,完全符合需求。

内容的提问来源于stack exchange,提问作者Akav

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 07:55:14