从Pandas DataFrame中选择列中最新的有限值的高效方法是什么?

4

我正在尝试找到与当前索引相关的最新值不为“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

我想知道相对于索引4的'B'的最后已知值,该值在索引1处:
       A       B       C
1    5.1   -> 4.6    NaN

我知道使用类似下面的方式可以获取所有具有 NaN 值的索引列表:

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

但是在大型数据库中,这种方法效率低下。有没有一种方法来相对于当前索引仅tail最后一个元素?


你期望的输出是什么? - Psidom
理想情况下,我希望得到值为 4.6 和索引为 1 - alphaleonis
您是只想查询索引4的最新数据还是想查询所有索引的数据? - Psidom
对于这种情况,只需查找索引处的一个(在示例中为4)。 - alphaleonis
2个回答

5

您可以尝试这样做,将index转换为一个系列,该系列具有与列B相同的NaN值,然后使用ffill(),它将最后一个非缺失索引向前传递到所有后续的NaN

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


5

一些有用的方法需要了解

last_valid_index
first_valid_index
针对索引为4的列B

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


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