获取pandas数据帧的每列中最后一个非NaN值的行索引

时间:2014-08-18 09:04:40

标签: python-2.7 pandas numpy scipy nan

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

2 个答案:

答案 0 :(得分:5)

使用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

答案 1 :(得分:1)

如果你想要最后一个非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将一个函数应用于数据帧的每一列。我传递一个函数,它将一个列作为参数,并返回列的最后一个非空索引。