将最后一个有效索引掩码应用于数据帧以获取最后一个有效值

时间:2018-06-14 15:25:07

标签: python performance pandas numpy

我的数据框如下所示:

    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。

我已经使用.apply(pd.Series.last_valid_index)来获取值仍然是数值的索引,但是,我不确定检索一个我有实际值的系列的最有效方法最后一个有效索引的值。

理想情况下,我可以推导出一个类似的系列:

   value
s1 v10
s2 v6
s3 v9
s4 v4

或作为看起来像

的数据框
   s1 s2 s3 s4
0 v10 v6 v9 v4

非常感谢!

3 个答案:

答案 0 :(得分:5)

这是使用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

答案 1 :(得分:4)

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

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

s1    v10
s2     v6
s3     v9
s4     v4

答案 2 :(得分:2)

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

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

输出:

     s1 s2  s3  s4
0   v10 v6  v9  v4

此外,您的原始df保持不变。