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

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

我的数据集如下所示:

  1. id count
  2. A. 2
  3. A. 10
  4. B. 3
  5. B. 13
  6. B. 11
  7. C. 2
  8. C. 3

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

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

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

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

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

nfeuvbwi

nfeuvbwi1#

仅当您的 Dataframe 按 id :

  1. # a = df.sort_values('id').values
  2. a = df.values
  3. a = a[a[:, 0].argsort()]
  4. groups, indexes = np.unique(a[:, 0], return_index=True)
  5. values = np.split(a[:, 1], indexes[1:])
  6. r = np.array([(np.mean(v), np.sum(v)) for v in values])

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

  1. >>> groups
  2. array(['A.', 'B.', 'C.'], dtype=object)
  3. >>> indexes
  4. array([0, 2, 5])
  5. >>> values
  6. [array([2, 10], dtype=object),
  7. array([3, 13, 11], dtype=object),
  8. array([2, 3], dtype=object)]
  9. >>> r
  10. array([[ 6. , 12. ],
  11. [ 9. , 27. ],
  12. [ 2.5, 5. ]])

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

  1. id_ = np.random.randint(1, 1001, 1000000)
  2. count = np.random.randint(1, 60, 1000000)
  3. df = pd.DataFrame({'id': id_, 'count': count})
  4. %timeit np.array([(np.mean(v), np.sum(v)) for v in values])
  5. 18 ms ± 465 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
展开查看全部

相关问题