我有一个具有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])