【问题标题】:Get last non-NaN value for each month in pandas获取熊猫每个月的最后一个非NaN值
【发布时间】:2019-03-26 05:07:29
【问题描述】:

我有一个表单的 DataFrame

eqt_code    ACA_FP  AC_FP  AI_FP
BDATE                           
2015-01-01     NaN    NaN    NaN
2015-01-02     NaN    NaN    NaN
2015-01-05       1    NaN    NaN
2015-01-06     NaN    NaN    NaN
2015-01-07     NaN    NaN    NaN
2015-01-08     NaN    0.2    NaN
2015-01-09     NaN    NaN    NaN
2015-01-12       5    NaN    NaN
2015-01-13     NaN    NaN    NaN
2015-01-14     NaN    NaN    NaN
2015-01-15     NaN    NaN    NaN

我希望每个月都获取每列的最后一个非 NaN 值(如果没有有效值,则为 NaN)。因此导致类似

eqt_code    ACA_FP  AC_FP  AI_FP
BDATE                           
2015-01-31       5    0.2    NaN
2015-02-28      10      1      3
2015-03-31     NaN    NaN      3
2015-04-30      10      1      3

我有两个想法来执行此操作:

  • 执行 ffill 并限制到月底。类似df.ffill(<add good thing here>).resample('M').last()

  • 使用last_valid_indexresample('M')

【问题讨论】:

    标签: python pandas dataframe nan


    【解决方案1】:

    使用resample

    df.resample('M').last()
    Out[82]: 
                ACA_FP  AC_FP  AI_FP
    eqt_code                        
    2015-01-31     1.0    0.2    NaN
    

    【讨论】:

    • 觉得你需要last
    【解决方案2】:

    使用groupbylast

    # Do this if the index isn't a DatetimeIndex.
    # df.index = pd.to_datetime(df.index)
    df.groupby(df.index + pd.offsets.MonthEnd(0)).last()
    
                ACA_FP  AC_FP  AI_FP
    BDATE                           
    2015-01-31     5.0    0.2    NaN
    ...
    

    【讨论】:

    • 工作就像一个魅力。非常感谢!
    【解决方案3】:

    使用df.dropna(how='all') 将删除所有值均为NaN 的每一行,并为您提供大部分内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-01
      • 2015-08-24
      • 2019-04-07
      • 2016-04-09
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      相关资源
      最近更新 更多