首页 > 解决方案 > 使用 groupby 列从 Min 和 Max 列值计算 Pandas Dataframe 的变化率

问题描述

我有一个如下的数据框:

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

标签: pythonpython-3.xpandasdataframepandas-groupby

解决方案


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

推荐阅读