用倒数第三个值替换 NaN 值

Replace NaN values with third to last value

我刚开始使用 Python,我的计算存在以下问题。 我有一个 table,其中包含 NaN 个值。 NaN 值总是出现在晚上,因为那里无法测量太阳辐射。 我想用日落前 4 小时的值替换一个晚上的所有 NaN 值。 我已经尝试使用 Ffill 命令,但由于我不需要 NaN 值之前的最后一个值,所以不幸的是它不起作用。

例如:

a=[0.88, 0.84, 0.26, 0.50, 1.17, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 0.73, 0.81]

连续的 NaN 值都应具有值 0.84。 因此,该列表应如下所示:

a=[0.88, 0.84, 0.26, 0.50, 1.17, 0.84, 0.84, 0.84, 0.84, 0.84, 0.84, 0.84, 0.84, 0.73, 0.81]

提前致谢。

import pandas as pd

a = [0.88, 0.84, 0.26, 0.50, 1.17, None, None, None, None, None, None, None, None, 0.73, 0.81]
df = pd.DataFrame(a)
df[3:] = df[3:].fillna(value=df.iloc[1, 0])
print(df)
       0
0   0.88
1   0.84
2   0.26
3   0.50
4   1.17
5   0.84
6   0.84
7   0.84
8   0.84
9   0.84
10  0.84
11  0.84
12  0.84
13  0.73
14  0.81

一个选项是创建原始系列的 shifted 和 ffilled 版本,然后仅使用它来填充原始数据的空值:

In [231]: s.fillna(s.shift(3).mask(s.isnull()).ffill())
Out[231]:
0     0.88
1     0.84
2     0.26
3     0.50
4     1.17
5     0.84
6     0.84
7     0.84
8     0.84
9     0.84
10    0.84
11    0.84
12    0.84
13    0.73
14    0.81
dtype: float64
a=[0.88, 0.84, 0.26, 0.50, 1.17, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, 0.73, 0.81]
a = np.array(a)
a[np.isnan(a)] = a[1]
a

结果:

array([0.88, 0.84, 0.26, 0.5 , 1.17, 0.84, 0.84, 0.84, 0.84, 0.84, 0.84,
       0.84, 0.84, 0.73, 0.81])