gpt4 book ai didi

python - 减少在 Python 中运行多个 group by 的时间

转载 作者:太空宇宙 更新时间:2023-11-03 20:36:48 25 4
gpt4 key购买 nike

我想将分类变量的多个(1000 个)不同组合作为“group_by”级别运行,并返回这些组中其他指标的总和。

我已经编写了代码,使用 groupby 在 pandas 中运行它,它可以工作,但需要一些时间,使用 numpy 我可以提高单个 groupby 的速度,但在多个维度上运行 groupby 时时间会更慢。

是否有比 pandas 更快的方法来计算所需的聚合?

我在 pandas 中有一个可行的解决方案,我使用 numpy 以稍快的速度复制了单级聚合(一个分类变量):

att_data=df.loc[:,'class1'].values.astype(int)
weight_data=df.loc[:,'aggvar'].values
out=np.bincount(att_data, weights=weight_data)

当我尝试在多个维度上复制它时,numpy 解决方案比 pandas 聚合慢(大概是因为我花了更多的精力来创建所需的向量):

att_data1=df.loc[:,'class1'].values.astype(int)
att_data2=df.loc[:,'class2'].values.astype(int)
weight_data=df.loc[:,'aggvar'].values
test_combin=np.column_stack((att_data1, att_data2))
nouse, att_comb_data=np.unique(test_combin, return_inverse=True, axis=0)
outi=np.bincount(att_comb_data, weights=weight_data)

这段代码可以工作,但我更愿意加快速度

df = pd.DataFrame(np.concatenate((np.random.randint(0,10,size=(100, 5)),100*np.random.random_sample(size=(100,1))),axis=1), columns=list(('class1','class2','class3','class4','class5','aggvar')))

agg_list=['class1','class2','class3','class4','class5']

for agg1 in agg_list:
for agg2 in agg_list:
if agg1==agg2:
out_ag=df.groupby(agg1).agg({'aggvar':np.sum})
else:
out_ag=df.groupby([agg1,agg2]).agg({'aggvar':np.sum})

预期结果是分类变量的所有组合级别的组合聚合,如下所示(我可以构建但想要加速基本聚合):

1_class 2nd_class   1_class_val 2nd_class_val   sum(aggvar)
class1 1 50125
class1 2 96397
class1 3 94886
class1 class2 1 1 12531
class1 class2 1 2 17544
class1 class2 1 3 10025
class1 class2 1 4 10025
class1 class2 1 1 37593
class1 class2 1 2 12531

最佳答案

您可以并行化分组操作。具体示例可以参见 herehere

关于python - 减少在 Python 中运行多个 group by 的时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57113772/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com