2017-02-17 5 views
2

私はグループにソートしたい情報が入っているパンダにデータフレームを持っています。各グループから、そのグループの列全体から特定の列の最初の値を差し引きたいと思います。値は、追加の列としてデータフレームに追加されます。 私の最初のデータフレームの例:各グループからグループ固有の値を引く

   time sample x  y  mass 

       3  1.0  216 12 12 
       4  1.0  218 13 12 
       5  1.0  217 12 12 
       6  1.0  234 13 13 
       1  2.0  361 289 23 
       2  2.0  362 287 22 
       3  2.0  362 286 22 
       5  3.0  124 56 18 
       6  3.0  126 52 17 

私は、結果として持ちたいもの:

 sample time  x  y  mass xdiff 

     1.0  3  216 12 12  0 
     1.0  4  218 13 12  2 
     1.0  5  217 12 12  1 
     1.0  6  214 13 13  -2 
     2.0  1  361 289 23  0 
     2.0  2  362 287 22  1 
     2.0  3  362 286 22  1 
     3.0  5  124 56 18  0 
     3.0  6  126 52 17  2 

これまでのところ、私は唯一の作品を把握することができます:

   s = df.groupby('sample') 
       #gives me the groups 
       s["x"].nth(0) 
       #gets the first x value of each group 

私は」そのサンプルグループのすべてのx値から各サンプルグループの最初のx値を引き算する方法がわかりません。 これはどのように行うことができますか?ありがとう!

答えて

5

あなたはfirstで使用transformによって作成された新しいSeriesで列をsubstractすることができます:apply

print (df.groupby('sample')['x'].transform('first')) 
0 216 
1 216 
2 216 
3 216 
4 361 
5 361 
6 361 
7 124 
8 124 
Name: x, dtype: int64 


df['xdiff'] = df['x'] - df.groupby('sample')['x'].transform('first') 
print (df) 
    time sample x y mass xdiff 
0  3  1.0 216 12 12  0 
1  4  1.0 218 13 12  2 
2  5  1.0 217 12 12  1 
3  6  1.0 234 13 13  18 
4  1  2.0 361 289 23  0 
5  2  2.0 362 287 22  1 
6  3  2.0 362 286 22  1 
7  5  3.0 124 56 18  0 
8  6  3.0 126 52 17  2 

df['xdiff'] = df['x'].sub(df.groupby('sample')['x'].transform('first')) 
print (df) 
    time sample x y mass xdiff 
0  3  1.0 216 12 12  0 
1  4  1.0 218 13 12  2 
2  5  1.0 217 12 12  1 
3  6  1.0 234 13 13  18 
4  1  2.0 361 289 23  0 
5  2  2.0 362 287 22  1 
6  3  2.0 362 286 22  1 
7  5  3.0 124 56 18  0 
8  6  3.0 126 52 17  2 

し、解決策を:

df['xdiff'] = df.groupby('sample')['x'].apply(lambda x: x - x.iloc[0]) 
print (df) 
    time sample x y mass xdiff 
0  3  1.0 216 12 12  0 
1  4  1.0 218 13 12  2 
2  5  1.0 217 12 12  1 
3  6  1.0 234 13 13  18 
4  1  2.0 361 289 23  0 
5  2  2.0 362 287 22  1 
6  3  2.0 362 286 22  1 
7  5  3.0 124 56 18  0 
8  6  3.0 126 52 17  2 
+0

はあなたに感謝します!この権利を得るには、問題に近づく3つの方法があります。私は第3の解決策を理解しています、それは私が得ようとしていることの線に沿っていました。 – UserR6

+0

まったく同じ出力を持つ3種類のソリューションです。 – jezrael

関連する問題