Как суммировать в группе значений, а затем взять разницу из другой группы?
Допустим, у меня есть этот упрощенный фрейм данных с тремя переменными:
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