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

如何在Pandas/Numpy中对仅含有效值的序列计算滚动函数?

问题:Pandas滚动计算中忽略NaN并结合时间索引的需求

数据特征与需求

  • 数据每行对应特定时间索引下某列的具体值
  • 每行存在多个非NaN值,但数量有限
  • 需要实现基于有效值、结合相对时间索引的梯度滚动函数

尝试过的无效方法

曾尝试Pandas、Numpy的常规处理方式,包括dropna方法、skipna参数,均无法满足需求。

示例代码与效果对比

生成测试数据

import numpy as np
import pandas as pd

fa = np.random.randn(10,4)
mask = np.zeros(40, dtype=bool)
mask[:15] = True
np.random.shuffle(mask)
mask = mask.reshape(10,4)
fa[mask] = np.nan

idx = pd.date_range("2023-01-01", periods=10, freq="S")
df = pd.DataFrame(fa, index=idx)

常规滚动求和的输出(不符合需求)

执行df.rolling(3).apply(lambda s: s.sum())后得到:

0         1   2   3
2023-01-01 00:00:00       NaN       NaN NaN NaN
2023-01-01 00:00:01       NaN       NaN NaN NaN
2023-01-01 00:00:02       NaN -1.370696 NaN NaN
2023-01-01 00:00:03 -0.905364       NaN NaN NaN
2023-01-01 00:00:04 -1.207028       NaN NaN NaN
2023-01-01 00:00:05 -1.027719       NaN NaN NaN
2023-01-01 00:00:06 -0.080573 -1.087092 NaN NaN
2023-01-01 00:00:07 -0.069553       NaN NaN NaN
2023-01-01 00:00:08 -0.126387       NaN NaN NaN
2023-01-01 00:00:09 -0.126387       NaN NaN NaN

期望输出(忽略NaN,仅基于有效值计算)

希望输出仅针对每列的有效值进行滚动计算,效果相当于对每列先执行df[n].dropna()再做滚动求和,之后手动填充回原索引:

2023-01-01 00:00:00       NaN       NaN       NaN       NaN
2023-01-01 00:00:01       NaN       NaN       NaN       NaN
2023-01-01 00:00:02       NaN -1.370696       NaN       NaN
2023-01-01 00:00:03 -0.589829 -1.289354       NaN       NaN
2023-01-01 00:00:04 -0.039064 -0.451169       NaN       NaN
2023-01-01 00:00:05 -0.398826 -1.087092       NaN  1.226619
2023-01-01 00:00:06  0.357316       NaN  0.131681  3.589662
2023-01-01 00:00:07 -0.028043       NaN       NaN       NaN
2023-01-01 00:00:08       NaN  0.161823 -0.746563       NaN
2023-01-01 00:00:09 -0.455660  0.213346       NaN  4.192798

关键难点

手动对每列单独处理并填充可以实现求和的示例效果,但实际需求的滚动函数需要结合时间索引作为输入,因此无法通过简单替换NaN为0的方式解决。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 23:00:11