我有下面的一个例子:

data = {'a': {1: None, 2: 1, 3: 7, 4: 2, 5: 4},
 'b': {1: None, 2: 2, 3: 2, 4: 9, 5: 6},
 'c': {1: None, 2: 2.0, 3: None, 4: 7.0, 5: 4.0}}
df = pd.DataFrame(data).rename_axis('day')

       a    b    c
day               
1    NaN  NaN  NaN
2    1.0  2.0  2.0
3    7.0  2.0  NaN
4    2.0  9.0  7.0
5    4.0  6.0  4.0

我想得到一个新的列("std"),其中包含所有列值的滚动标准差.NaN应该被忽略.假设滚动窗口中包含的行数是3,min_periods(意味着至少有一个非空值的行数)是2.

这是预期输出:

       a    b    c       std
day                         
1    NaN  NaN  NaN       NaN
2    1.0  2.0  2.0       NaN
3    7.0  2.0  NaN  2.387467
4    2.0  9.0  7.0  3.116775
5    4.0  6.0  4.0  2.531939

第一个std值(2.387467)等于np. std([1,2,2,7,2],ddof = 1).

我try 了两个解决方案,建议here,但他们不工作与我的框架,可能是因为NaN.

推荐答案

您可以使用numpy.nanstd处理缺失值:

#source https://stackoverflow.com/a/77704074/2901002
from numpy.lib.stride_tricks import sliding_window_view as swv

N = 3
df.loc[df.index[N-1:], 'std'] = np.nanstd(swv(df.to_numpy(), N, axis=0), (1,2), ddof=1)

print (df)
       a    b    c       std
day                         
1    NaN  NaN  NaN       NaN
2    1.0  2.0  2.0       NaN
3    7.0  2.0  NaN  2.387467
4    2.0  9.0  7.0  3.116775
5    4.0  6.0  4.0  2.531939

Python相关问答推荐

如何才能知道Python中2列表中的巧合.顺序很重要,但当1个失败时,其余的不应该失败或是0巧合

更改matplotlib彩色条的字体并勾选标签?

Pandas实际上如何对基于自定义的索引(integer和非integer)执行索引

运行Python脚本时,用作命令行参数的SON文本

什么相当于pytorch中的numpy累积ufunc

try 将一行连接到Tensorflow中的矩阵

无法使用DBFS File API路径附加到CSV In Datricks(OSError Errno 95操作不支持)

Python逻辑操作作为Pandas中的条件

dask无groupby(ddf. agg([min,max])?''''

numpy.unique如何消除重复列?

Polars map_使用多处理对UDF进行批处理

Pandas—堆栈多索引头,但不包括第一列

如何删除重复的文字翻拍?

在numpy数组中寻找楼梯状 struct

在电影中向西北方向对齐""

在极点中读取、扫描和接收有什么不同?

如何在Python中解析特定的文本,这些文本包含了同一行中的所有内容,

无法在盐流道中获得柱子

大型稀疏CSR二进制矩阵乘法结果中的错误

为什么在生成时间序列时,元组索引会超出范围?