假设我有三个变量的简化数据框:
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
知道如何解决这个问题吗?
答案 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