如何使用不同的聚合函数高效聚合同一列? [英] How to efficiently aggregate the same column using different aggregate functions?

查看:34
本文介绍了如何使用不同的聚合函数高效聚合同一列?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

考虑以下数据:

df = pd.DataFrame({"id": [1, 1, 1, 2, 2], "value": [10, 50, 90, 25, 75]})
df
   id  value
0   1     10
1   1     50
2   1     90
3   2     25
4   2     75

如何通过id高效优雅地聚合列考虑同一列上的多个聚合函数,例如:

    value_min  value_max  value_mean  value_sum  value_max_diff
id
1          10         90          50        150              80
2          25         75          50        100              50

一种方法是创建多个透视表,每个聚合函数(内置或非内置)创建一个透视表,然后连接结果,例如:

def max_diff(x):
    return np.max(x) - np.min(x)
funcs = [np.min, np.max, np.mean, np.sum, max_diff]

tmp = [pd.pivot_table(df, index=["id"], values=["value"],
                      aggfunc={"value": f}).rename(columns={"value": f"value_{f.__name__}"}) for f in funcs]
pivot = pd.concat(tmp, axis=1)
pivot
    value_amin  value_amax  value_mean  value_sum  value_max_diff
id
1           10          90          50        150              80
2           25          75          50        100              50
但是,在我看来,考虑到多个列和每个列有多个甚至不同的聚合函数,这种方法的伸缩性不是很好。正如雷蒙德·赫廷格所说:肯定有更好的办法!那么,哪一个更好?

提前谢谢!

推荐答案

可以使用pandas.DataFrame.groupbyDataFrameGroupBy.aggregate

df.groupby("id").agg(funcs)

#   value                        
#    amin amax mean  sum max_diff
#id                              
#1     10   90   50  150       80
#2     25   75   50  100       50


多列不同功能解决方案:

df = pd.DataFrame({"id": [1, 1, 1, 2, 2], "value1": [10, 50, 90, 25, 75], "value2": [1, 5, 6, 3, 8]})

#   id  value1  value2
#0   1      10       1
#1   1      50       5
#2   1      90       6
#3   2      25       3
#4   2      75       8

funcs = {"value1": [np.min, np.max], "value2": [np.mean, np.sum, max_diff]}

df.groupby("id").agg(funcs)

#   value1      value2             
#     amin amax   mean sum max_diff
#id                                
#1      10   90    4.0  12        5
#2      25   75    5.5  11        5

这篇关于如何使用不同的聚合函数高效聚合同一列?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆