【问题标题】:Get row-index of the last non-NaN value in each column of a pandas data frame获取 pandas 数据框每一列中最后一个非 NaN 值的行索引
【发布时间】:2014-10-11 03:37:44
【问题描述】:

如何返回 pandas 数据框每一列的最后一个非 nan 值的行索引位置,并将位置作为 pandas 数据框返回?

【问题讨论】:

  • 如果我的回答让你满意,你可以接受,投票按钮下方会有一个空的勾号。

标签: python-2.7 pandas numpy scipy nan


【解决方案1】:

如果你想要最后一个非 nan(和 non-none)值的行索引,这里是一个单行:

>>> df = pd.DataFrame({
        'a':[5,1,2,NaN], 
        'b':[NaN, 6,NaN, 3]})

>>> df
    a   b
0   5 NaN
1   1   6
2   2 NaN
3 NaN   3

>>> df.apply(lambda column: column.dropna().index[-1])
a    2
b    3
dtype: int64

解释:

df.apply 在此上下文中将函数应用于数据帧的每一列。我向它传递了一个函数,该函数将一个列作为其参数,并返回该列的最后一个非空索引。

【讨论】:

    【解决方案2】:

    使用notnull 特别是idxmax 来获取非NaN 值的索引值

    In [22]:
    
    df = pd.DataFrame({'a':[0,1,2,NaN], 'b':[NaN, 1,NaN, 3]})
    df
    Out[22]:
        a   b
    0   0 NaN
    1   1   1
    2   2 NaN
    3 NaN   3
    In [29]:
    
    df[pd.notnull(df)].idxmax()
    Out[29]:
    a    2
    b    3
    dtype: int64
    

    编辑

    实际上正如@Caleb 正确指出的那样,您可以使用为此设计的last_valid_index

    In [3]:
    df = pd.DataFrame({'a':[3,1,2,np.NaN], 'b':[np.NaN, 1,np.NaN, -1]})
    df
    
    Out[3]:
        a   b
    0   3 NaN
    1   1   1
    2   2 NaN
    3 NaN  -1
    
    In [6]:
    df.apply(pd.Series.last_valid_index)
    
    Out[6]:
    a    2
    b    3
    dtype: int64
    

    【讨论】:

    • 这似乎没有解决问题。这不是为您提供每列最大值的索引位置吗?不是最后一个值,正如操作所要求的那样?
    • @Caleb 好点,使用last_valid_index 更新我的答案是正确的方法
    • 哦,我提供了另一个答案,但我认为你的更好。
    • 有没有办法用非数值来做到这一点?我想在列中获取值的第一个实例
    • @RyanDavies 这将适用于混合 dtype 列,如果您想要第一个实例,请致电 first_valid_index
    猜你喜欢
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 2022-01-09
    • 2016-07-22
    • 1970-01-01
    • 2014-11-10
    • 2019-12-09
    • 2017-08-25
    相关资源
    最近更新 更多