使用numpy实现group by操作

Pandas下的group by操作速度慢,在百万级数据量下可以使用PyFunctional下的group by,千万级速度又吃不消了,可以借助numpy,但实现有点麻烦,记录一下。

一、问题描述
【推荐场景】输入二维数组a,千万行,3列,*列是用户id,第二列是物品id,第三列是分值。先计算每个用户下分值*高的物品(Top1推荐),然后按照物品将这些用户组合起来(推送名单)。

二、实现代码

a = a[a[:, 0].argsort()] # 按照user_id排序(排序是使用np.split进行分组的前提)
a = np.split(a, np.unique(a[:, 0], return_index=True)[1][1:]) # 按照user_id分组
a = np.array([tmp[tmp[:, 2].argsort()[-1], :2] for tmp in a]) # 取分组下分值*高的item_id
a = a[a[:, 1].argsort()]
item_ids, ind = np.unique(a[:, 1], return_index=True)
a = np.split(a[:, 0], ind[1:])
result = dict(zip(item_ids, a))