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

时间:2016-10-19 00:46:19

标签: 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.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只相对于当前索引的最后一个?

2 个答案:

答案 0 :(得分:5)

您可以尝试这样的操作,将index转换为与列NaN具有相同B值的系列,然后使用带有最后一个非ffill()的{​​{1}}所有后续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

enter image description here

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

答案 1 :(得分:4)

了解

的一些有用方法

<强> last_valid_index
first_valid_index
列索引B

中的列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

enter image description here