Tengo el siguiente marco de datos:
from numpy import nan df = pd.DataFrame({'Date': ['2014-09-30', '2014-10-01', '2014-10-31', '2014-11-01'], 'X1': [20, nan, 19, nan], 'X2': [nan,2,nan,4], 'X3': [5,nan,9,nan], }) Date X1 X2 X3 0 2014-09-30 20 nan 5 1 2014-10-01 nan 2 nan 2 2014-10-31 19 nan 9 3 2014-11-01 nan 4 nanComo puede ver, el problema es que las columnas tienen un tiempo de liberación diferente. Quiero crear un marco de datos único con el día de fin de mes para cada variable. Por lo tanto, el resultado debería ser:
Date X1 X2 X3 0 2014-09-30 20 2 5 1 2014-10-31 19 4 9¿Alguien puede ayudarme a conseguirlo?
¡Gracias!
Puede usar pandas pandas.tseries.offsets.MonthEnd para groupby por + first
from pandas.tseries.offsets import MonthEnd g = pd.to_datetime(df['Date']) + MonthEnd(1) - MonthEnd() df.groupby(g, as_index=False).first().convert_dtypes()producción:
Date X1 X2 X3 0 2014-09-30 20 2 5 1 2014-10-31 19 4 9También puede completar todos los valores nan con el método bfill y dejar solo los últimos días del mes usando la función dt.is_month_end :
(df.fillna(method='bfill') [pd.to_datetime(df['Date']).dt.is_month_end] .reset_index(drop=True) )Producción:
Date X1 X2 X3 0 2014-09-30 20 2 5 1 2014-10-31 19 4 9