我想运行多个(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