Получить последнее значение не-NaN за каждый месяц в пандах - PullRequest
3 голосов
/ 25 марта 2019

У меня есть 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_index с resample('M').

Ответы [ 3 ]

2 голосов
/ 26 марта 2019

Использование resample

df.resample('M').last()
Out[82]: 
            ACA_FP  AC_FP  AI_FP
eqt_code                        
2015-01-31     1.0    0.2    NaN
2 голосов
/ 25 марта 2019

Используйте groupby и last:

# 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
...
0 голосов
/ 26 марта 2019

Использование df.dropna(how='all') удалит каждую строку, в которой все значения равны NaN, и проведет вас большую часть пути туда.

...