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

2024-04-19 05:52:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个带有空值和非空值的序列“s”:

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]

非常感谢

问候 汤姆


Tags: np序列nanseriespd空值问候s1
3条回答
s1 = []
for i in range(len(s)-1):
    if s[i+1] == np.nan:
        s1.append(s[i])

让我们使用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

根据@ShubamSharma的答案,获取空的行,转换为类型int,获取1和0之间的差异,从底部开始计算(因为我们正在查找nan之前的最后一个非空值),最后使用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])

相关问题 更多 >