【问题标题】:How can I speed groupby?如何加快 groupby 的速度?
【发布时间】:2021-07-17 20:08:18
【问题描述】:

我有以下数据框:

import pandas as pd
array = {'id': [1, 1, 1, 2, 2, 2, 3, 3], 'A': [False, False, True, False, False, False, True, True],
         'B': [False, True, True, False, True, False, False, False]}
df = pd.DataFrame(array)
df

我想在一行中表示每个 id。如果特定列上此 id 的所有值均为 False,则其值应为 False。如果至少有一个是 True - 那么它应该是 True。 我已经开始了:

df.groupby(['id']).sum()

之后,我会将高于 0 的每个值都转换为 1。 这很好用,但我的原始数据框有 2,000,000 行和 14,000 列,因此需要几天时间......

还有其他更快的想法来完成这项任务吗?

【问题讨论】:

  • 我希望df.groupby(['id']).any() 工作得快得多,因为any() 应该是短路的。令人惊讶的是,它实际上更慢。
  • @jezrael - 有什么想法吗?会重视您的帮助!

标签: pandas dataframe pandas-groupby


【解决方案1】:

您可以通过取最大值而不是每组的总和来保存第二步:

df.groupby(['id']).max()

您可能期望与any 聚合应该更快,因为这样每个子系列只需在到达第一个True 之前进行评估,但显然以下要慢得多(根据 DYZ 的评论):

df.groupby(['id']).agg(any)

所以我建议使用 NumPy 的 any 函数对其进行测试,它可能会更好地处理这个问题:

import numpy as np
df.groupby(['id']).agg(np.any)

或者你可以不用agg,正如亨利埃克所建议的那样:

df.groupby(['id']).any()

但是,这些方法都没有预期的那么快。因此,也许您最好的选择是将数据帧转换为 NumPy 整数数组并在纯 NumPy 中进行分组。见this question

【讨论】:

  • 使用any() 实际上要很多慢。我怀疑pandas的@​​987654331@没有短路。
  • 谢谢。但是,我并不担心第二步 - 因为我仍然坚持第一步...... :-(
  • 谢谢@DYZ,我确实假设它应该短路了。
  • @HenryEcker 即使df.groupby(['id']).any()df.groupby(['id']).sum() 慢。
  • 是的,我自己在计时。这确实很奇怪。
猜你喜欢
  • 2013-07-20
  • 1970-01-01
  • 2023-01-26
  • 2015-11-02
  • 2014-10-04
  • 2011-06-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多