我有一个如下数据框:
NAME,VAL1,VAL2
AAA,27,678
BBB,45,744
CCC,34,275
AAA,29,932
CCC,47,288
BBB,24,971
AAA,16,468
BBB,90,982
CCC,68,751
AAA,23,254
CCC,87,575
CCC,63,364
需要计算每个姓名
Result_Val1 = ((Max of Val1 - Min of Val1)/Min of Val1)
Result_Val2 = ((Max of Val2 - Min of Val2)/Min of Val2)
结果应如下所示:
NAME,Result_Val1,Result_Val2
AAA,0.81,2.67
BBB,2.75,0.32
CCC,1.56,1.73
答案 0 :(得分:2)
类似groupby
之类的事应该在事后进行。
v = df.groupby('NAME').agg(['max', 'min'])
mx = v.xs('max', level=1, axis=1)
mn = v.xs('min', level=1, axis=1)
(mx - mn) / mn
VAL1 VAL2
NAME
AAA 0.812500 2.669291
BBB 2.750000 0.319892
CCC 1.558824 1.730909
让我们尝试使用自定义功能的替代方法:
def scaled_ptp(x):
mn = x.min()
return (x.max() - mn) / mn
df.groupby('NAME').agg(scaled_ptp)
您可以在一行中执行相同的操作,但是在python3.8中需要赋值表达式:
df.groupby('NAME').agg(lambda x: (x.max() - y := x.min()) / y)
VAL1 VAL2
NAME
AAA 0.812500 2.669291
BBB 2.750000 0.319892
CCC 1.558824 1.730909