es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Añade las columnas trimestrales restantes que no tengan ningún valor.

Tengo datos de series temporales mensuales de la siguiente manera:

  Elemento  2020 Ene  2020 Feb  2020 Mar  2020 Jul  2020 Ago  2020 Sep
0    A         0         1         2         3         4         5
1    B         5         4         3         2         1         0

Necesitaba convertir estos datos mensuales en datos trimestrales como la suma de tres meses, así que adapté el código de aquí para hacer precisamente eso:

df = df.groupby(pd.PeriodIndex(df.columns, freq='Q'), axis=1).sum()

El resultado de df es el siguiente:

  Elemento  2020 T1  2020 T3
0    A        3       12
1    B       12        3

Sin embargo, quería que aparecieran todos los trimestres, no solo aquellos que tienen un valor mayor que 0. Entonces, mi resultado deseado es el siguiente:

  Elemento  2020 T1  2020 T2  2020 T3
0    A        3        0       12
1    B       12        0        3

Así que en esta salida, hay una columna adicional T2 porque está entre el primer y el último trimestre, aunque no tenga valores positivos. ¿Alguien sabe cómo hacer eso?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para obtener todos los períodos trimestrales, incluso si tienen valores de 0 en los datos originales, puede crear un DataFrame vacío con todos los períodos trimestrales necesarios y luego combinar los dos dataframes utilizando una unión externa (outer join).

    En primer lugar, cree un índice de períodos trimestrales que comience desde el primer mes en el dataframe original hasta el último mes:

    quarter_index = pd.period_range(start=df.columns[1], end=df.columns[-1], freq='Q')
    

    Luego, cree un dataframe vacío con este índice y la columna Item:

    empty_df = pd.DataFrame(index=quarter_index, columns=['Item']).reset_index()
    

    Esto crea un DataFrame con 3 columnas, con los períodos trimestrales en el índice y una columna Item vacía.

    A continuación, establezca las columnas de período trimestral en el dataframe original como el índice y luego vuelva a indexarlo utilizando el índice trimestral, completando los valores faltantes con 0. Finalmente, combine los dos dataframes utilizando una unión externa (outer join):

    df = df.set_index('Item')
    df = df.reindex(quarter_index, axis=1, fill_value=0)
    merged_df = empty_df.merge(df, how='outer', on='index')
    merged_df.columns = ['Quarter', 'Item', '2020 Q1', '2020 Q2', '2020 Q3']
    

    Esto te brinda la salida deseada con todos los períodos trimestrales incluidos, incluso si tienen valores de 0:

       Quarter Item  2020 Q1  2020 Q2  2020 Q3
    0   2020Q1   A        3        0       12
    1   2020Q2   A        0        0        0
    2   2020Q3   A        0        0        0
    3   2020Q1   B       12        0        3
    4   2020Q2   B        0        0        0
    5   2020Q3   B        0        0        0
    

Comments are closed.