首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >groupby后用于聚合的列组合

groupby后用于聚合的列组合
EN

Stack Overflow用户
提问于 2020-02-02 17:41:38
回答 1查看 641关注 0票数 1

问题

寻找类似的东西

代码语言:javascript
运行
复制
df.groubpy('key').aggregate(combination(columnA, columnB))

而不是

代码语言:javascript
运行
复制
df['combination'] = combination(columnA, columnB)
df.groupby('key')['combination'].aggregate()

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

描述

我看起来很自然,从逻辑上讲,在某些情况下,我会先进行分组,然后进行聚合。

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

寻找

列的

  1. groupby
  2. choose组合
  3. 使用相应的聚合函数

而不是

为每个聚合function)

  • groupby (针对每个聚合function)

  • apply特定的聚合函数

)创建所有必需的列。

示例

代码语言:javascript
运行
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-02 18:13:37

好的,所以我想你要找的答案是-我们不这么做,因为在python中是矢量化的。

考虑下面的代码。

实际上,python通常被优化为以矢量化的方式执行某些数学操作(例如numpypandas )--这意味着将其应用于整个向量比将其分解为块并随后执行更快。

因此,df["A"].mul(df["B"])将比:df.apply(lambda X: X["A"]*X["B"], axis=0)更快。分组也是如此--只是这样更具有可伸缩性。

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

编辑

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

(1)我们分组,逐行评估。

(2)用矢量化的方法处理完整的df,并分组应用内建聚合函数。

(3)分组,用矢量化的方法进行处理,按组进行聚类。

本质上--从结果来看--我们看到分解成块会减缓处理速度,不管是每个组,还是每个记录--所以矢量化的解决方案比我们可以应用在顶部的任何类型的自定义解决方案都要好。

代码语言:javascript
运行
复制
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")
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60028836

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档