Сложить или вычесть значения некоторых столбцов двух Pandas DataFrame

есть два Pandas DataFrame вида:

d1 = [{'account': 'Alex', 'Jan': 1, 'Feb': 4, 'Mar': 7, 'idx': 1},
         {'account': 'Bob',  'Jan': 2, 'Feb': 5, 'Mar': 8, 'idx': 2},
         {'account': 'Den',  'Jan': 3,  'Feb': 6,  'Mar': 9, 'idx': 3 }]
d2 = [{'account': 'Alex', 'Jan': 10, 'Feb': 14, 'Mar': 21, 'idx': 1},
         {'account': 'Alex',  'Jan': 11, 'Feb': 15, 'Mar': 20, 'idx': 2},
         {'account': 'Bob',  'Jan': 12, 'Feb': 16, 'Mar': 19, 'idx': 2},          
         {'account': 'Den',  'Jan': 13,  'Feb': 17,  'Mar': 18, 'idx': 3 }]
df1 = pd.DataFrame(d1)
df2 = pd.DataFrame(d2)

Нужно из них получить df3 и df4 с такой же структурой столбцов, чтобы в них были только совпадающие одновременно по обоим столбцам 'account' и 'idx' строки из первых двух датафреймов, при этом числовые значения из остальных столбцов были равны сумме соответствующих значений из df1 и df2 для df3, и разности их же для df4.


Ответы (1 шт):

Автор решения: strawdog

При ваших исходных:

df3 = df1.set_index(['account', 'idx']).add(df2.set_index(['account', 'idx'])).dropna().reset_index()
df4 = df1.set_index(['account', 'idx']).sub(df2.set_index(['account', 'idx'])).dropna().reset_index()

Тогда df3 будет:

  account  idx   Jan   Feb   Mar
0    Alex    1  11.0  18.0  28.0
1     Bob    2  14.0  21.0  27.0
2     Den    3  16.0  23.0  27.0

а df4, соответственно:

  account  idx   Jan   Feb   Mar
0    Alex    1  -9.0 -10.0 -14.0
1     Bob    2 -10.0 -11.0 -11.0
2     Den    3 -10.0 -11.0  -9.0
→ Ссылка