从每个组中减去组特定值

Use*_*rR6 5 python dataframe pandas

我在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
Run Code Online (Sandbox Code Playgroud)

结果我想要的是:

       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
Run Code Online (Sandbox Code Playgroud)

到目前为止我只能弄清楚:

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

我只是不确定如何从该样本组中的所有x值中减去每个样本组的第一个x值.有谁知道如何做到这一点?谢谢!

jez*_*ael 6

您可以通过.减去新列Series使用创建transform具有first:

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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)

解决方案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
Run Code Online (Sandbox Code Playgroud)