从每个组中减去组特定值

时间:2017-02-17 11:44:43

标签: python pandas dataframe

我在pandas中有一个数据框,其中包含我想要分组的信息。从每个组中,我想从该组中的整个列中减去某个列的第一个值。然后应将这些值作为附加列添加到数据框中。 我的初始数据框的一个例子:

              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值。 有谁知道如何做到这一点?谢谢!

1 个答案:

答案 0 :(得分:6)

您可以使用transform使用first创建的新Series来减去列:

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