【问题标题】:Get column name with last valid value for each index获取每个索引的最后一个有效值的列名
【发布时间】:2021-07-18 16:05:07
【问题描述】:

我有一个这样的数据框 -

   A    B    C
0  1  NaN  3.0
1  2  3.0  NaN
2  2  NaN  NaN
3  NaN NaN 53 

我需要找到每个索引的最后一个有效值的列名。例如对于上面的数据框,我想得到这样的输出。

['C','B','A','C]

我确实尝试获取列名,但只能通过在数据帧的转置上使用 iteritems() 来获取值。此外,由于它循环遍历数据框,我发现它不是非常理想的。请在下面找到我的方法

l_val = []
for idx, row in df.T.iteritems():
    last_val = None
    for x in row:
        if not pd.isna(x):
            last_val = x
    l_val.append(last_val)

返回 -

[3.0, 3.0, 2.0]

我尝试了很多搜索,但大多数答案都提到了last_valid_index 方法,该方法将返回列中的最后一个有效索引,如果我可以使用它来解决我的问题,我不会得到。有人可以建议我任何快速的方法吗?

【问题讨论】:

    标签: python pandas numpy


    【解决方案1】:

    你可以这样做:

    df.idxmax(axis=1).to_list()
    

    输出:

    ['C', 'B', 'A', 'C']
    

    编辑:

    对于我上面展示的解决方案,您将获得最大值的索引。但是,您也可以有一个数据框,其中第一列中的值大于最后列中的值。然后我建议使用下面的解决方案来获取最后一个有效值的索引:

    df.T.apply(pd.Series.last_valid_index).to_list()
    

    输出:

    ['C', 'B', 'A', 'C']
    

    【讨论】:

    • 谢谢,让我快速尝试一下我的数据框。
    • 当我在我的 df 上运行它时,它会抛出一个错误“TypeError: reduction operation 'argmax' not allowed for this dtype”
    • 当数据类型不是数字时会出现此错误。您可以尝试: df = df.apply(pd.to_numeric, errors='ignore') 然后再试一次,或者只使用我在编辑后的答案中提供的第二个解决方案。
    • 我认为更新后的解决方案非常有效。非常感谢。不需要其他任何东西:)
    猜你喜欢
    • 2018-11-24
    • 2018-12-01
    • 2014-10-11
    • 1970-01-01
    • 2011-12-14
    • 2014-11-10
    • 2016-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多