Tengo un marco de datos:

df = pd.DataFrame({ 
    'BU': ['AA', 'AA', 'AA', 'BB', 'BB', 'BB'], 
    'Line_Item': ['Revenues','EBT', 'Expenses', 'Revenues', 'EBT', 'Expenses'],
    '201901': [100, 120, 130, 200, 190, 210],
    '201902': [100, 120, 130, 200, 190, 210],
    '201903': [200, 250, 450, 120, 180, 190],
    '202001': [200, 250, 450, 120, 180, 190],
    '202002': [200, 250, 450, 120, 180, 190],
    '202003': [200, 250, 450, 120, 180, 190]
})

Las columnas representan años y meses respectivamente. Me gustaría sumar las columnas durante meses en una nueva columna para el año. El resultado debe parecer lo siguiente:

df = pd.DataFrame({ 
    'BU': ['AA', 'AA', 'AA', 'BB', 'BB', 'BB'], 
    'Line_Item': ['Revenues','EBT', 'Expenses', 'Revenues', 'EBT', 'Expenses'],
    '201901': [100, 120, 130, 200, 190, 210],
    '201902': [100, 120, 130, 200, 190, 210],
    '201903': [200, 250, 450, 120, 180, 190],
    '202001': [200, 250, 450, 120, 180, 190],
    '202002': [200, 250, 450, 120, 180, 190],
    '202003': [200, 250, 450, 120, 180, 190],
    '2019': [400, 490, 710, 520, 560, 610],
    '2020': [600, 750, 1350, 360, 540, 570]
})

Mi conjunto de datos real tiene varios años y tiene 12 meses por cada año. Con la esperanza de no tener que agregar las columnas manualmente.

0
postcolonialist 9 jun. 2021 a las 01:11

2 respuestas

La mejor respuesta

Intente crear un contexto de datos que contenga las columnas del año y convertir los nombres de las columnas to_datetime:

data_df = df.iloc[:, 2:]
data_df.columns = pd.to_datetime(data_df.columns, format='%Y%m')
   2019-01-01  2019-02-01  2019-03-01  2020-01-01  2020-02-01  2020-03-01
0         100         100         200         200         200         200
1         120         120         250         250         250         250
2         130         130         450         450         450         450
3         200         200         120         120         120         120
4         190         190         180         180         180         180
5         210         210         190         190         190         190

{{x0} } las columnas por año y rename columnas a solo los valores del año:

data_df = (
    data_df.resample('Y', axis=1).sum().rename(columns=lambda c: c.year)
)
   2019  2020
0   400   600
1   490   750
2   710  1350
3   520   360
4   560   540
5   610   570

Luego, {{x0 }} Volver al proceso de datos original:

new_df = df.join(data_df)

new_df:

   BU Line_Item  201901  201902  201903  202001  202002  202003  2019  2020
0  AA  Revenues     100     100     200     200     200     200   400   600
1  AA       EBT     120     120     250     250     250     250   490   750
2  AA  Expenses     130     130     450     450     450     450   710  1350
3  BB  Revenues     200     200     120     120     120     120   520   360
4  BB       EBT     190     190     180     180     180     180   560   540
5  BB  Expenses     210     210     190     190     190     190   610   570
2
Henry Ecker 8 jun. 2021 a las 22:25

¿Las columnas están sumando siempre el mismo? Es decir, ¿hay siempre 3 2019 columnas con esos mismos nombres y 3 2020 columnas con esos nombres? Si es así, solo puede codificar esas nuevas columnas.

df['2019'] = df['201901'] + df['201902'] + df['201903']
df['2020'] = df['202001'] + df['202002'] + df['202003']
0
scotscotmcc 8 jun. 2021 a las 22:19