将上一个有效索引掩码应用于dataframe以获取最后一个有效值

2024-05-14 00:17:37 发布

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

我有一个如下所示的数据帧:

    s1        s2       s3       s4
0   v1        v2       v3       v4
0   v5        v6       v7       np.nan
0   v8      np.nan     v9       np.nan
0   v10     np.nan     np.nan   np.nan

基本上从上到下有数值,跨列的一些随机索引值将切换到np.nan公司只有。在

我用过。申请(pd.Series.last_有效索引)但是,要获得值仍然是数值的索引,我不确定检索在最后一个有效索引处有实际值的序列的最有效方法。在

理想情况下,我可以推导出一个系列,看起来像:

^{pr2}$

或者作为一个看起来像

   s1 s2 s3 s4
0 v10 v6 v9 v4

非常感谢!在


Tags: 数据s3npv3nans4v2v4
3条回答

您需要规范化索引,找到每列的最后一个有效索引并从中创建一个数据帧。在

df = df.reset_index(drop=True)
ser = df.apply(lambda x: x.last_valid_index())
pd.DataFrame([df[col][ser[col]] for col in df.columns], index=df.columns).T

输出:

^{pr2}$

同样,这样,原始的df保持不变。在

这是使用NumPy索引的一种方法:

# ensure index is normalised
df = df.reset_index(drop=True)

# calculate last valid index across dataframe
idx = df.apply(pd.Series.last_valid_index)

# create result using NumPy indexing
res = pd.Series(df.values[idx, np.arange(df.shape[1])],
                index=df.columns,
                name='value')

print(res)

s1    v10
s2     v6
s3     v9
s4     v4
Name: value, dtype: object

以下是另一种方法,无需重置索引:

df.apply(lambda x: x[x.notnull()].values[-1])

s1    v10
s2     v6
s3     v9
s4     v4

相关问题 更多 >