3
votes

Obtenez la dernière valeur non-NaN pour chaque mois dans les pandas

J'ai un DataFrame de la forme

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

Et j'aimerais, pour chaque mois, obtenir la dernière valeur non-NaN de chaque colonne (NaN s'il n'y a pas de valeur valide) . Résultat: quelque chose comme

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

J'ai eu deux idées pour effectuer ceci:

  • Faites un ffill avec une limite qui va à la fin du mois. Quelque chose comme df.ffill (). Resample ('M'). Last () .

  • Utilisez last_valid_index avec resample('M').


0 commentaires

3 Réponses :


2
votes

Utilisez groupby et 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
...


1 commentaires

A travaillé comme un charme. Merci beaucoup!



0
votes

L'utilisation de df.dropna (how = 'all') supprimera chaque ligne où toutes les valeurs sont NaN , et vous y conduira la plupart du temps.


0 commentaires

2
votes

Utilisation de resample

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


1 commentaires

Vous pensez avoir besoin de dernier !