【问题标题】:Subtracting group specific values from each group从每个组中减去组特定值
【发布时间】:2017-02-17 21:27:33
【问题描述】:

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

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    您可以用transformfirst 创建的新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
    

    【讨论】:

    • 谢谢!只是为了做到这一点-这是解决问题的三种不同方法吗?我理解第三种解决方案,它与我试图达到的目标一致。
    • 没错,它是 3 种不同的解决方案,具有相同的输出。
    猜你喜欢
    • 2015-07-27
    • 2013-12-21
    • 2019-03-05
    • 1970-01-01
    • 2013-01-29
    • 1970-01-01
    • 1970-01-01
    • 2022-09-23
    • 1970-01-01
    相关资源
    最近更新 更多