У меня есть датафрейм:

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]
})

Столбцы представляют годы и месяцы соответственно. Я хотел бы суммировать столбцы за месяцы в новые столбцы за год. Результат должен выглядеть следующим образом:

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]
})

Мой фактический набор данных состоит из нескольких лет и 12 месяцев на каждый год. Надеясь не добавлять столбцы вручную.

0
postcolonialist 9 Июн 2021 в 01:11

2 ответа

Лучший ответ

Попробуйте создать DataFrame, содержащий столбцы года, и преобразовать имена столбцов 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} } столбцы по годам и rename только значения года:

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

Затем {{X0 }} обратно к исходному DataFrame:

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 Июн 2021 в 22:25

Всегда ли столбцы, которые вы суммируете, одинаковы? То есть всегда есть 3 столбца 2019 с одинаковыми именами и 3 столбца 2020 с этими именами? Если это так, вы можете просто жестко закодировать эти новые столбцы.

df['2019'] = df['201901'] + df['201902'] + df['201903']
df['2020'] = df['202001'] + df['202002'] + df['202003']
0
scotscotmcc 8 Июн 2021 в 22:19