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