如何使用不同的聚合函数有效地聚合同一列?

2024-06-13 00:32:40 发布

您现在位置:Python中文网/ 问答频道 /正文

考虑以下数据:

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

然而,在我看来,考虑到多列以及每列有多个甚至不同的聚合函数,这种方法的可伸缩性不是很强。正如雷蒙德·海廷格所说:“一定有更好的办法!”那么,哪一个更好?

提前谢谢


Tags: 方法函数iddfvaluenpdiffmin
1条回答
网友
1楼 · 发布于 2024-06-13 00:32:40

您可以使用^{}^{}执行此操作:

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

相关问题 更多 >