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