首页 > 解决方案 > Groupby 和基于特定行值的计算

问题描述

我的数据如下所示:

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],我想找出行的value和行的value之间的差异perfect。它看起来像这样:

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。

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

标签: pythonpandasdataframepandas-groupby

解决方案


使用 选择数据框的横截面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

推荐阅读