Как суммировать в группе значений, а затем взять разницу из другой группы?

Допустим, у меня есть этот упрощенный фрейм данных с тремя переменными:

ID    sample  test_result
P1    Normal           9
P1    Normal           18
P2    Normal           7
P2    Normal           16
P3    Normal           2
P3    Normal           11
P1     Tumor           6
P1     Tumor           15
P2     Tumor           5
P2     Tumor           15
P3     Tumor           3
P3     Tumor           12

Я хочу знать, как суммировать test_result значения для каждого идентичного ID в каждом типе образца (т.е. Normal, Tumor). Тогда я хочу тогда взять разницу между суммированной нормой и опухолью test_result ценности.

Я попытался использовать groupby для столбца образца, а затем использовать метод diff() для столбца test_result, но это не сработало. Я думаю, мне нужно знать, как сначала применить.sum(), но не знаю, как это сделать.

Вот что я попробовал:

df.groupby('sample')['test_result'].diff()

Результат, который я ожидаю, выглядит так:

ID   test_result
P1             6 # (the sum of P1 Normal = 27) - (the sum of P1 Tumor = 21)  
P2             3
P3            -2 

Есть идеи, как с этим справиться?

1 ответ

Решение

Использование groupby с sum и изменить по unstack:

df = df.groupby(['ID','sample'])['test_result'].sum().unstack()

Или же pivot_table:

df = df.pivot_table(index='ID',columns='sample', values='test_result', aggfunc='sum')

а затем вычтите столбцы:

df['new'] = df['Normal'] - df['Tumor']
print (df)
sample  Normal  Tumor  new
ID                        
P1          27     21    6
P2          23     20    3
P3          13     15   -2
Другие вопросы по тегам