给定一个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.argmin(a, axis=1) - 1
nan
我想有一种方法可以使用np.where,但是除了评估每一行的所有元素之外,我看不到一种明显的优雅方法来重新排列输出以获取每一行的最后一个索引:
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]))
pandas.Series有一个last_valid_index方法:
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