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,等级],我想找到的区别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。

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

回答

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


回答

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

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


以上是Groupby和基于特定行值的计算的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>