python—通过聚合加快数据传输速度

a14dhokn  于 2021-09-08  发布在  Java
关注(0)|答案(1)|浏览(379)

我的数据集如下所示:

id     count
A.     2
A.     10
B.     3
B.     13
B.     11
C.     2
C.     3

我需要为每个id聚合“count”值的总和和平均值。使用Pandas,我正在做这样的事情:

stats = df.groupby('id').agg({'agg': ['sum', 'mean']})

我尝试使用numpy阵列对此进行优化:

counts = df['count'].values
ids = df['id'].values
all_ids = df['id'].unique()
stats = [(i, np.mean(df[ids==i]), np.sum(df[ids==i])) for i in all_ids]

然而,这最终要比相应的实现花费更多的时间。有没有办法加快速度(可能使用一些numpy功能?)

nfeuvbwi

nfeuvbwi1#

仅当您的 Dataframe 按 id :


# a = df.sort_values('id').values

a = df.values
a = a[a[:, 0].argsort()]
groups, indexes = np.unique(a[:, 0], return_index=True)
values = np.split(a[:, 1], indexes[1:])
r = np.array([(np.mean(v), np.sum(v)) for v in values])

我想你可以用 np.view 分类,但我不知道如何使用它。

>>> groups
array(['A.', 'B.', 'C.'], dtype=object)

>>> indexes
array([0, 2, 5])

>>> values
[array([2, 10], dtype=object),
 array([3, 13, 11], dtype=object),
 array([2, 3], dtype=object)]

>>> r
array([[ 6. , 12. ],
       [ 9. , 27. ],
       [ 2.5,  5. ]])

演出
对于1000000个值和1000个不同的组

id_ = np.random.randint(1, 1001, 1000000)
count = np.random.randint(1, 60, 1000000)
df = pd.DataFrame({'id': id_, 'count': count})

%timeit np.array([(np.mean(v), np.sum(v)) for v in values])
18 ms ± 465 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

相关问题