Учитывая два кадра данных, как показано ниже, как я могу создать третий, например desired_output?

Должна быть показана разница между суммой МВЗ от df1 и суммой МВЗ df2 для каждого МВЗ, указанного в df1 или df2 (по умолчанию) сумма для df1 должна быть равна 0).

Так, например, первая сумма в desired_output рассчитывается следующим образом: 100 - (50 + 150) = -100.

Обратите также внимание, что столбцы МВЗ и суммы указаны по-разному в каждом df.

import pandas as pd

d = {
    'cost_center': [1, 2, 3, 4, 5, 2, 5, 5],
    'amount': [100, 200, 300, 400, 500, 500, 500, 300],
}

d2 = {
    'cc': [1, 4, 5, 6, 7, 1, 7],
    'a': [50, 150, 250, 350, 450, 150, 750],
}

desired_output = {
    'cost_center': [1, 2, 3, 4, 5, 6, 7],
    'df_amount_minus_df2_amount': [-100, 700, 300, 250, 1050, -350, -1200],
}

df = pd.DataFrame(d)
df2 = pd.DataFrame(d2)
0
barciewicz 2 Июл 2019 в 16:49

3 ответа

Лучший ответ

Похоже, что вы хотите groupby().sum() каждого кадра данных, а затем найти разницу:

common_index = sorted(list(set(df.cost_center.unique()).union(set(df2.cc))))

sum1 =  df.groupby('cost_center').amount.sum().reindex(common_index, fill_value=0) 
sum2 = df2.groupby('cc').a.sum().reindex(common_index, fill_value=0)

sum1-sum2

Дает :

cost_center
1    -100
2     700
3     300
4     250
5    1050
6    -350
7   -1200
dtype: int64
1
Quang Hoang 2 Июл 2019 в 14:01

Конечно, не единственное решение, но опция, использующая groupby().sum() и объединяющая кадры данных, а затем вычисляющая разницу:

df3 = (df.groupby('cost_center', as_index=False).sum()
         .merge(df2.groupby('cc', as_index=False).sum(),
                left_on='cost_center', right_on='cc', how='outer')
         .fillna(0))
df3['diff'] = df3['amount'] - df3['a']
df3

   cost_center  amount   cc       a    diff
0          1.0   100.0  1.0   200.0  -100.0
1          2.0   700.0  0.0     0.0   700.0
2          3.0   300.0  0.0     0.0   300.0
3          4.0   400.0  4.0   150.0   250.0
4          5.0  1300.0  5.0   250.0  1050.0
5          0.0     0.0  6.0   350.0  -350.0
6          0.0     0.0  7.0  1200.0 -1200.0
0
Brendan 2 Июл 2019 в 14:03

Думай о другом

df2.columns=df.columns
pd.concat([df,df2.assign(amount=-df2.amount)]).groupby('cost_center').sum()
Out[234]: 
             amount
cost_center        
1              -100
2               700
3               300
4               250
5              1050
6              -350
7             -1200
0
YO and BEN_W 2 Июл 2019 в 14:06