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

df = pd.DataFrame({ 
    'BU': ['Total', 'Total', 'Total', 'CRS', 'CRS', 'CRS'], 
    'Line_Item': ['Revenues','EBT', 'Expenses', 'Revenues', 'EBT', 'Expenses'],
    '1Q16-1': [100, 120, 0, 200, 190, 210],
    '2Q16-1': [100, 0, 130, 200, 190, 210],
    '3Q16-1': [200, 250, 0, 120, 0, 190],
    '1Q16-2': [100, 120, 0, 200, 190, 210],
    '2Q16-2': [100, 0, 130, 200, 190, 210],
    '3Q16-2': [200, 250, 0, 120, 0, 190]
})

Я хочу добавить столбцы таким образом, чтобы получить новые столбцы, в которых первый столбец представляет собой сумму 1Q16-1 и 1Q16-2, второй столбец представляет собой сумму 2Q16-1 и 2Q16-2 и т. Д. Порядок важен для добавления.

df_sum = [1Q16-1 + 1Q16-2, 2Q16-1 +2Q16-2...]

Если бы столбцы были одинаково названы в двух фреймах данных, я мог бы использовать

df_add = df1.add(df2, fill_value=0)
2
postcolonialist 5 Май 2021 в 03:00

2 ответа

Лучший ответ

Вы можете assign() новые столбцы с пониманием:

df = df.assign(**{
    f'{i}Q16': df[f'{i}Q16-1'] + df[f'{i}Q16-2'] for i in [1,2,3]
})

Также можно выполнить суммирование с помощью фильтра like:

df = df.assign(**{
    f'{i}Q16': df.filter(like=f'{i}Q16').sum(1) for i in [1,2,3]
})

Выход:

      BU Line_Item  1Q16-1  2Q16-1  3Q16-1  1Q16-2  2Q16-2  3Q16-2  1Q16  2Q16  3Q16
0  Total  Revenues     100     100     200     100     100     200   200   200   400 
1  Total       EBT     120       0     250     120       0     250   240     0   500 
2  Total  Expenses       0     130       0       0     130       0     0   260     0 
3    CRS  Revenues     200     200     120     200     200     120   400   400   240 
4    CRS       EBT     190     190       0     190     190       0   380   380     0 
5    CRS  Expenses     210     210     190     210     210     190   420   420   380 
2
tdy 5 Май 2021 в 00:18

Итак, вам нужно сделать

df['1Q16-sum'] = df['1Q16-1'] + df['1Q16-2']
df['2Q16-sum'] = df['2Q16-1'] + df['2Q16-2']
df['3Q16-sum'] = df['3Q16-1'] + df['3Q16-2']

Или с петлей

# python 3.6+
for i in range(1,4):
    df[f'{i}Q16-sum'] = df[f'{i}Q16-1'] + df[f'{i}Q16-2']

# or other python versions
for i in range(1,4):
    id = str(i) + "Q16"
    df[id+'-sum'] = df[id+'-1'] + df[id+'-2']

Давая вам

      BU Line_Item  1Q16-1  2Q16-1  3Q16-1  1Q16-2  2Q16-2  3Q16-2  1Qq6-sum  2Qq6-sum  3Qq6-sum
0  Total  Revenues     100     100     200     100     100     200       200       200       400
1  Total       EBT     120       0     250     120       0     250       240         0       500
2  Total  Expenses       0     130       0       0     130       0         0       260         0
3    CRS  Revenues     200     200     120     200     200     120       400       400       240
4    CRS       EBT     190     190       0     190     190       0       380       380         0
5    CRS  Expenses     210     210     190     210     210     190       420       420       380

Это оно ?

0
Jimmar 5 Май 2021 в 00:19