首页 > 解决方案 > groupby 后聚合列的组合

问题描述

问题

寻找类似的东西

df.groubpy('key').aggregate(combination(columnA, columnB))

代替

df['combination'] = combination(columnA, columnB)
df.groupby('key')['combination'].aggregate()

唯一的要求是在groupby之后计算列的组合。


描述

对于某些情况,我似乎很自然,逻辑上明智,首先是 groupby 然后聚合。

一个示例是针对使用相同组的不同列组合的不同聚合函数。

寻找

  1. 通过...分组
  2. 选择列组合
  3. 使用相应的聚合函数

代替

  1. 创建所有必要的列(对于每个聚合函数)
  2. groupby(对于每个聚合函数)
  3. 应用特定的聚合函数

例子

key     ColumnA  ColumnB
key1       1        1
key2       2        2
key1       3        3
key3       4        4
key2       5        5

#can do
df['combination'] = df.columnA * df.columnB
df.groupby('key').mean()

#looking for
grouped = df.groupby('key')
grouped.mean(columnA * columnB)

标签: pythonpandasaggregatepandas-groupby

解决方案


好的,所以我认为您正在寻找的答案是 - 我们不这样做,因为 python 中的矢量化

考虑下面的代码。

现在本质上 - python 通常被优化为以矢量化方式(例如)执行某些数学运算numpy-pandas这意味着 - 将它应用于整个向量比将其分解成块然后执行它更快。

所以 egdf["A"].mul(df["B"])会比:df.apply(lambda X: X["A"]*X["B"], axis=0). 分组也是如此 - 它只是这样更具可扩展性。

试试下面的代码 - 它本质上就是你所指的 - 所以在 Vs after 之前进行操作groupby(...)。矢量化解决方案的扩展速度非常快,即使您实现了额外的列 - 您处理的行越多,您将看到的差异越大。

编辑

我在分组数据上添加了矢量化解决方案,所以我们有:

(1) 我们分组,我们逐行懒惰地评估

(2) 我们以向量化的方式处理完整的 df,我们分组我们应用内置的聚合函数

(3)我们分组,我们以向量化的方式处理组,按组,我们做聚合函数

从本质上讲 - 从我们看到的结果来看,分解成块会减慢处理速度,无论是按组还是按记录 - 所以矢量化解决方案比我们可以在顶部应用的任何类型的自定义解决方案都更好地扩展。

import pandas as pd
import numpy as np
import time

x=np.random.randint(1,9,(3000,5))
df=pd.DataFrame(x, columns=[f"column{l}" for l in list("ABCDE")])
df["cat"]=np.random.choice([f"key{l}" for l in list("ABCDEFG")], size=3000)
df2=df3=df
#print(df)
s=time.time()
df.groupby("cat").apply(lambda z: np.prod(z.values, axis=1).mean()).pipe(print)
e=time.time()-s
print(f"method 1: {e} s")

s=time.time()
df2["prod"]=np.prod(df[[f"column{l}" for l in list("ABCDE")]], axis=1)
df2.groupby("cat")["prod"].mean().pipe(print)
e=time.time()-s
print(f"method 2: {e} s")

s=time.time()
df3=list(map(lambda x: (x[0], np.prod(x[1][[f"column{l}" for l in list("ABCDE")]], axis=1).mean()), df3.groupby("cat")))
print(df3)
e=time.time()-s
print(f"method 3: {e} s")

推荐阅读