2024-04-19 05:52:40 发布
网友
我有一个带有空值和非空值的序列“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]
非常感谢
问候 汤姆
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值:
Series.isna
Series.cumsum
NaN
groupby
transform
last
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获得结果:
int
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])
让我们使用
Series.isna
+Series.cumsum
来创建一个grouper,以识别非NaN
值的连续块,然后groupby
此grouper上的序列和transform
使用last
最终屏蔽grouper中的duplicated
值:结果:
根据@ShubamSharma的答案,获取空的行,转换为类型
int
,获取1和0之间的差异,从底部开始计算(因为我们正在查找nan之前的最后一个非空值),最后使用np.where
获得结果:相关问题 更多 >
编程相关推荐