Python 从DataFrame中选择列中具有有限值的最新索引的有效方法?

Python 从DataFrame中选择列中具有有限值的最新索引的有效方法?,python,pandas,numpy,dataframe,Python,Pandas,Numpy,Dataframe,我正在尝试查找最新的索引,其值相对于当前索引而言不是“NaN”。所以,假设我有一个数据帧,其值为“NaN”,如下所示: A B C 0 2.1 5.3 4.7 1 5.1 4.6 NaN 2 5.0 NaN NaN 3 7.4 NaN NaN 4 3.5 NaN NaN 5 5.2 1.0 NaN 6 5.0 6.

我正在尝试查找最新的索引,其值相对于当前索引而言不是“NaN”。所以,假设我有一个数据帧,其值为“NaN”,如下所示:

       A       B       C
0    2.1     5.3     4.7
1    5.1     4.6     NaN
2    5.0     NaN     NaN
3    7.4     NaN     NaN
4    3.5     NaN     NaN
5    5.2     1.0     NaN
6    5.0     6.9     5.4
7    7.4     NaN     NaN
8    3.5     NaN     5.8
如果我当前处于索引4,则我具有以下值:

       A       B       C
4    3.5     NaN     NaN
我想知道“B”相对于索引4的最后一个已知值,它位于索引
1

       A       B       C
1    5.1   -> 4.6    NaN
我知道我可以使用以下方法获得具有NaN值的所有索引的列表:

indexes = df.index[df['B'].apply(np.isnan)]

但这在大型数据库中似乎效率低下。有没有办法将
tail
仅作为相对于当前索引的最后一个索引?

您可以尝试类似的方法,将
索引
转换为与列
B
具有相同
NaN
值的序列,然后使用
ffill()
为所有后续
NaN
s向前携带最后一个非缺失索引:

import pandas as pd
import numpy as np
df['Last_index_notnull'] = df.index.to_series().where(df.B.notnull(), np.nan).ffill()
df['Last_value_notnull'] = df.B.ffill()
df


现在在索引
4
,您知道最后一个非缺失值是
4.6
,索引是
1

一些有用的方法

最后一个有效索引

第一个有效索引

对于索引
4

df.B.ix[:4].last_valid_index()

1
您可以通过这种方式将其用于所有列

pd.concat([df.ix[:i].apply(pd.Series.last_valid_index) for i in df.index],
          axis=1).T

您的预期输出是什么?理想情况下,我希望得到值
4.6
和索引
1
。您只想知道索引
4
处的最新索引,还是想知道所有索引的最新索引?对于这种情况,只需要查找索引处的索引(在示例中是4)。