2017-12-05 11 views
0

하자 내가 세 개의 변수이 단순화 dataframe이 있다고 :groupby를 사용하고 두 그룹의 차이점을 사용하는 방법은 무엇입니까?

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를 사용한 다음 test_result 열에서 diff() 메서드를 사용했지만 작동하지 않았습니다. 여기

내가 시도 것입니다 :

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

당신은 헤더에 sample 열을 선회하고 정상 및 종양 사이에서 뺄 수 있습니다

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 
+0

을 계속 사용할 수 있습니다 무엇 나는'ID'에 중복 값이있는 경우 기둥. '.pivot' 오류 메시지를 피할 수있는 해결 방법이 있습니까 :'ValueError : 중복 된 엔트리를 가지고있는 인덱스는 변형 할 수 없습니다'? 감사! – MEhsan

+0

그런 경우 ID 및 샘플 열을 먼저 집계해야 할 수 있습니다. – Psidom

+0

어떻게 보여 주시겠습니까? – MEhsan

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