2017-12-05 35 views
0

レッツは、私は三つの変数と、この単純化されたデータフレーム持っていると言う:groupbyを使って2つのグループの違いをどうやって使うのですか?

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()メソッドを使用してみましたが、機能しませんでした。ここで

は、私が試したものです:

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

を使い続けることができますカラム。 '.pivot'エラーメッセージを避けるための回避策がありますか?' ValueError:重複したエントリが含まれているインデックスには再形成できません '?ありがとう! – MEhsan

+0

その場合は、ID列とサンプル列を最初に集計する必要があります。 – Psidom

+0

あなたはどのように私を見せてくれますか? – MEhsan

0

それとも私たちは、私が `ID`で重複する値を持っている場合はどう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 
関連する問題