Использование массива numpy широковещание :
df = pd.DataFrame({'A':[5, 3, 8],
'B':[3, 2, 1]})
df2 = pd.DataFrame(df['A'].values[:, None] - df['B'].values, columns=['C', 'D', 'E'])
df = df.join(df2)
Результат:
A B C D E
0 5 3 2 3 4
1 3 2 0 1 2
2 8 1 5 6 7
Объяснение :
>>> df['A'].values[:, None]
array([[5],
[3],
[8]])
>>> df['B'].values
array([3, 2, 1])
При их вычитании numpy "растягивается" df['A'].values[:, None]
до:
array([[5, 5, 5],
[3, 3, 3],
[8, 8, 8]])
и df['B'].values
до:
array([[3, 2, 1],
[3, 2, 1],
[3, 2, 1]])
и результат вычитания равен :
array([[2, 3, 4],
[0, 1, 2],
[5, 6, 7]])