使用groupby列从Min和Max列值计算Pandas Dataframe的变化率

时间:2018-08-18 09:02:50

标签: python python-3.x pandas dataframe pandas-groupby

我有一个如下数据框:

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

1 个答案:

答案 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