获取排序的numpy矩阵或熊猫数据框的最后一个非nan索引

发布于 2021-01-29 15:04:58

给定一个numpy数组(或pandas数据框),如下所示:

import numpy as np

a = np.array([
[1,      1,      1,    0.5, np.nan, np.nan, np.nan],
[1,      1,      1, np.nan, np.nan, np.nan, np.nan],
[1,      1,      1,    0.5,   0.25,  0.125,  0.075],
[1,      1,      1,   0.25, np.nan, np.nan, np.nan],
[1, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],
[1,      1,    0.5,    0.5, np.nan, np.nan, np.nan]
])

我正在寻找最有效地检索每一行中最后一个非nan值的方法,因此在这种情况下,我将寻找一个返回如下内容的函数:

np.array([3,
          2,
          6,
          3,
          0,
          3])

我可以尝试一下np.argmin(a, axis=1) - 1,但是它至少具有两个不希望的属性-
对于以nan(dealbreaker)结尾的行,它会失败;并且,一旦达到给定行中的最后一个非nan值,它就不会“延迟评估”并停止(这与“必须正确”条件无关紧要)。

我想有一种方法可以使用np.where,但是除了评估每一行的所有元素之外,我看不到一种明显的优雅方​​法来重新排列输出以获取每一行的最后一个索引:

>>> np.where(np.isnan(a))
(array([0, 0, 0, 1, 1, 1, 1, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5]),
 array([4, 5, 6, 3, 4, 5, 6, 4, 5, 6, 1, 2, 3, 4, 5, 6, 4, 5, 6]))
关注者
0
被浏览
84
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    pandas.Series有一个last_valid_index方法:

    pd.DataFrame(a.T).apply(pd.Series.last_valid_index)
    Out: 
    0    3
    1    2
    2    6
    3    3
    4    0
    5    3
    dtype: int64
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看