返回nan次出现之前的最后一个非空值



我有一个具有null值和非null值的序列:

s = pd.Series([np.nan, 5, 4, 2, np.nan, np.nan, 4, 3, np.nan])

我需要在每个np.nan:之前获得"s1"返回的最后一个非空值

s1 = [np.nan, np.nan, np.nan, 2, np.nan, np.nan, np.nan, 3, np.nan]

非常感谢。

问候Tom

让我们使用Series.isna+Series.cumsum创建一个grouper来识别非NaN值的连续块,然后groupby这个grouper上的序列和transform使用last最终屏蔽grouper中的duplicated值:

g = s.isna().cumsum()
s1 = s.groupby(g).transform('last').mask(g.duplicated(keep='last'))

结果:

print(s1)
0    NaN
1    NaN
2    NaN
3    2.0
4    NaN
5    NaN
6    NaN
7    3.0
8    NaN
dtype: float64
s1 = []
for i in range(len(s)-1):
if s[i+1] == np.nan:
s1.append(s[i])

根据@ShubamSharma的答案,得到为null的行,转换为类型int,得到1和0之间的差,从底部开始计算(因为我们正在寻找nan之前的最后一个非null值(,最后使用np.where得到我们的结果:

s1 = np.where(s.isna().astype(int).diff(-1).eq(-1), s, np.nan)
s1
array([nan, nan, nan,  2., nan, nan, nan,  3., nan])

最新更新