2017-02-17 27 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 

我m只是不確定如何從該樣本組中的所有x值中減去每個樣本組的第一個x值。 有誰知道這可以做到嗎?謝謝!

回答

5

您可以通過創建新的Series使用transformfirst列。減去:

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 

和解決方案與apply

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

謝謝!爲了做到這一點 - 這是解決問題的三種不同方式嗎?我瞭解第三種解決方案,這是我試圖解決的問題。 – UserR6

+0

恰好,它是3種不同的解決方案,具有相同的輸出。 – jezrael