【问题标题】:Groupby and calculations based on specific row valueGroupby 和基于特定行值的计算
【发布时间】:2021-05-23 16:51:26
【问题描述】:

我的数据如下所示:

d = {'id' : [1, 1, 1, 2, 2, 2],
     'levels': ['low', 'perfect', 'high', 'low', 'perfect', 'high'],
     'value': [1, 10, 13, 2, 10, 13]}

df = pd.DataFrame(d, columns=['id', 'levels', 'value'])
df = df.groupby(['id','levels'])[['value']].mean()

对于每个 [id, levels],我想找出行的 valueperfect 行的 value 之间的区别。它看起来像这样:

id | levels | value | penalty
1  | high   | 13    | 3
   | low    | 1     | 9
   | perfect| 10    | 0
2  | high   | 13    | 3
   | low    | 2     | 8
   | perfect| 10    | 0

例如,在第一行中,您将从完美值 10 中减去 13,得到 3。

那么我该如何进行计算,找到每个[id, levels]perfect 值,然后找出差异呢?

【问题讨论】:

    标签: python pandas dataframe pandas-groupby


    【解决方案1】:

    使用xs 选择数据框的横截面,然后从level=0 上的给定数据框中减去此横截面

    df['penalty'] =  df['value'].sub(df['value'].xs('perfect', level=1)).abs()
    

                value  penalty
    id levels                 
    1  high        13        3
       low          1        9
       perfect     10        0
    2  high        13        3
       low          2        8
       perfect     10        0
    

    【讨论】:

      【解决方案2】:

      你可以尝试变换,然后减去并转换为绝对值:

      val = df.loc[df['levels'].eq('perfect').groupby(df['id']).transform('idxmax'),'value']
      df['penalty'] = df['value'].sub(val.to_numpy()).abs()
      

      print(df)
      
         id   levels  value  penalty
      0   1      low      1        9
      1   1  perfect     10        0
      2   1     high     13        3
      3   2      low      2        8
      4   2  perfect     10        0
      5   2     high     13        3
      

      【讨论】:

        猜你喜欢
        • 2017-07-24
        • 1970-01-01
        • 1970-01-01
        • 2023-01-14
        • 2022-10-14
        • 1970-01-01
        • 1970-01-01
        • 2018-01-14
        • 2018-09-18
        相关资源
        最近更新 更多