在pandas中获取每个月的最后一个非NaN值

3

I have a DataFrame of the form

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(<添加好的内容>).resample('M').last()

  • 使用last_valid_indexresample('M')

3个回答

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
...

1
非常顺利地完成了工作。非常感谢! - Antoine Falck

2
使用resample进行重采样
df.resample('M').last()
Out[82]: 
            ACA_FP  AC_FP  AI_FP
eqt_code                        
2015-01-31     1.0    0.2    NaN

1
你认为你需要 last - cs95

0

使用 df.dropna(how='all') 将删除所有值都为 NaN 的行,这将让你完成大部分工作。


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