减少在Python中运行多个分组的时间

时间:2019-07-19 13:42:22

标签: python

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

我已经编写了使用groupby在熊猫中运行此代码的代码,并且可以运行,但是需要一些时间,使用numpy可以提高单个groupby的速度,但是在多个维度上运行groupby时,计时会变慢。

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

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

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

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

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

1 个答案:

答案 0 :(得分:0)

您可以并行执行分组操作。可以在herehere中找到具体的示例。