当前位置: 首页 > 面试题库 >

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

段干帅
2023-03-14
问题内容

给定一个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]))

问题答案:

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


 类似资料:
  • 问题内容: 我有N维向量数组。 我正在使用sklearn的函数来计算距离值矩阵。注意,该矩阵关于对角线对称。 我需要与该矩阵中前N个值相对应的索引,因为这些索引将与成对索引相对应,它们代表了向量之间的最大距离。 我尝试做以获得每一行中最大值的索引,并获取每一列中最大值的索引,但是请注意: 和: 因为矩阵是关于对角线对称的,并且因为argmax返回它找到的具有最大值的第一个索引,所以我最终在行和列匹

  • 问题内容: 我需要找到最快的方法来对具有数百万行和约一百列的数据框中的每一行进行排序。 所以像这样: 需要成为: 现在,我将排序应用于每一行,并逐行建立一个新的数据框。我还在每行中做一些额外的,不太重要的事情(因此为什么我使用熊猫而不是numpy)。改为创建列表列表,然后立即构建新的数据框,会更快吗?还是我需要去赛顿? 问题答案: 我想我会在numpy中这样做: 我曾以为这可能有效,但是它对列进行

  • 问题内容: 我有一个熊猫数据框,看起来像这样: 一千行左右,六列。大多数单元格为空(NaN)。考虑到不同的列中包含文本,我想知道每列中文本的概率是多少。例如,这里的小片段将产生如下内容: 也就是说,Al01栏中有4个匹配项;在这4个匹配中,BBR60列中没有匹配,CA07列中也没有匹配,NL219列中有3个匹配。等等。 我可以遍历每一列并使用值构建字典,但这似乎很笨拙。有没有更简单的方法? 问题答

  • 问题内容: 我有以下代码: 它创建一个填充零的矩阵。相反,我想知道是否有一种函数或方法可以将它们初始化为s,而方法很简单。 问题答案: 您很少需要在numpy中进行矢量操作循环。您可以创建一个未初始化的数组并立即分配给所有条目: 我已经在这里和Blaenk发布的时间安排了时间: 时序显示优先选择作为更快的替代方案。OTOH,我喜欢numpy的便捷实现,在该实现中您可以同时为整个slice分配值,代

  • 我有一个空单元格的数据框,并希望用NaN替换这些空单元格。之前在这个论坛上提出的解决方案有效,但前提是单元格包含一个空间: 当单元格为空时,此代码不起作用。有人建议用熊猫代码来代替空细胞吗?

  • 获取相应列内容满足条件的索引范围的最有效方法是什么。。类似于以标记开始并以“body”标记结束的行。 例如,数据框如下所示 我要得到行索引1-3 有人能提出最具蟒蛇风格的方法来实现这一点吗?