【问题标题】:Efficient way to select most recent index with finite value in column from Pandas DataFrame?从 Pandas DataFrame 中选择列中具有有限值的最新索引的有效方法?
【发布时间】:2016-10-19 11:27:35
【问题描述】:

我正在尝试查找相对于当前索引的值不是“NaN”的最新索引。所以,假设我有一个像这样的“NaN”值的 DataFrame:

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

【问题讨论】:

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

标签: python pandas numpy dataframe


【解决方案1】:

您可以尝试这样的操作,将index 转换为与B 列具有相同NaN 值的系列,然后使用ffill() 将最后一个非缺失索引向前传递给所有后续@987654327 @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

【讨论】:

    【解决方案2】:

    了解一些有用的方法

    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
    

    【讨论】:

      猜你喜欢
      • 2023-04-06
      • 2020-11-25
      • 2023-03-21
      • 1970-01-01
      • 2016-01-15
      • 2019-05-31
      • 2021-04-20
      • 2014-02-09
      • 2012-07-01
      相关资源
      最近更新 更多