在pandas数据框中,获取每列最后一个非NaN值的行索引。

5
我应该如何返回pandas数据框每列的最后一个非NaN值的行索引位置,并将这些位置作为pandas数据框返回?
2个回答

9
使用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
@Caleb 说得好,我已经更新了我的答案,使用 last_valid_index 是正确的方法。 - EdChum
哦,我提供了另一个答案,但我认为你的更好。 - Caleb
有没有办法用非数字值来实现这个功能?我想要获取列中值的第一个实例。 - Ryan Davies
@RyanDavies 如果你想要在数据类型混合的列中找到第一个实例,可以调用 first_valid_index - EdChum

3
如果您想获取最后一个非NaN(和非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 在此上下文中将一个函数应用于数据帧的每一列。我传递给它一个接受列作为参数并返回该列最后一个非空索引的函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接