如何使用groupby并区分两组?

时间:2017-12-05 16:44:40

标签: python-3.x pandas group-by difference

假设我有三个变量的简化数据框:

 ID    sample  test_result
 P1    Normal           9
 P2    Normal           7
 P3    Normal           2
 P1     Tumor           6
 P2     Tumor           5
 P3     Tumor           3

我想知道正常和肿瘤test_results之间的区别,但我不确定如何接近它。

我尝试在sample列上使用groupby,然后在diff()列上使用test_result方法,但这不起作用。

以下是我的尝试:

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

我期待的输出就像:

ID   test_result
P1             3 # the difference between P1 Normal and P1 Tumor (i.e. 9-6)
P2             2
P3            -1 

知道如何解决这个问题吗?

2 个答案:

答案 0 :(得分:2)

您可以将sample列转移到标题,然后在Normal和Tumor之间减去:

df.pivot('ID', 'sample', 'test_result').assign(diff = lambda x: x.Normal - x.Tumor)['diff']

#ID
#P1    3
#P2    2
#P3   -1
#Name: diff, dtype: int64

答案 1 :(得分:0)

或者我们可以继续使用groupby

df['New']=df.sort_values('ID').groupby('ID')['test_result'].diff()
df
Out[636]: 
   ID  sample  test_result  New
0  P1  Normal            9  NaN
1  P2  Normal            7  NaN
2  P3  Normal            2  NaN
3  P1   Tumor            6 -3.0
4  P2   Tumor            5 -2.0
5  P3   Tumor            3  1.0
df.dropna()
Out[637]: 
   ID sample  test_result  New
3  P1  Tumor            6 -3.0
4  P2  Tumor            5 -2.0
5  P3  Tumor            3  1.0


df.dropna()[['ID','New']]
Out[639]: 
   ID  New
3  P1 -3.0
4  P2 -2.0
5  P3  1.0