滚动所有列的标准差,忽略 NaNs

问题描述 投票:0回答:1

我有以下数据框:

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)。

我尝试了here提出的两种解决方案,但它们无法与我的数据框正常工作,可能是因为 NaN。

python pandas dataframe numpy
1个回答
1
投票

您可以使用

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
© www.soinside.com 2019 - 2024. All rights reserved.