Попытка вычесть в сводной таблице вместо суммы

#python #pandas #numpy

#python #панды #numpy

Вопрос:

Я пытаюсь вместо использования np.sum пытаться использовать np.subtract в параметре pivot aggfunc . Использование np.sum работает.

Однако, когда я использую np.subtract , я получаю сообщение об ошибке с указанием:

в ufunc() отсутствует 1 из 2 требуемых позиционных аргументов

 table = pd.pivot_table(df, values='D', index=['A', 'B'], columns=['C'], aggfunc=np.subtract)
  

Допустим, гипотетически я получил следующий образец данных:

 A    B      C    D 
Bar  one  small  1 
Bar  one  large -2 
Bar  one  large  2 
Bar  two  small -3 
Bar  two  small -3 
TER  one  large  4 
TER  one  small -5 
  

Над столбцом один большой, использующий np.sum, приведет к нулю.
Мне нужно вычесть, чтобы это было нетто : -4: -2 - 2 = -4

Есть ли способ вычитать вместо sum?

Комментарии:

1. Можете ли вы добавить образец данных?

2. добавлен пример фрейма данных =)

Ответ №1:

Вы можете использовать этот трюк — умножить все дублирующиеся строки на -1 , а затем использовать sum :

 df['D'] *= np.where(df.duplicated(['A','B','C']), -1, 1)
print (df)
     A    B      C  D
0  Bar  one  small  1
1  Bar  one  large -2
2  Bar  one  large -2
3  Bar  two  small -3
4  Bar  two  small  3
5  TER  one  large  4
6  TER  one  small -5

table = pd.pivot_table(df, values='D', index=['A', 'B'], columns=['C'], aggfunc='sum')
print (table)
C        large  small
A   B                
Bar one   -4.0    1.0
    two    NaN    0.0
TER one    4.0   -5.0
  

Комментарии:

1. однако это приведет к неправильному изменению моих данных. ОДИН БОЛЬШОЙ не даст -4, а ОДИН МАЛЕНЬКИЙ не останется -5

2. @pybianco — Вы правы, добавлен столбец C в duplicated.

3. @pybianco — Если вы хотите что-то еще, пожалуйста, добавьте ожидаемый результат из образца данных.