我有以下数据框:
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。
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