【问题标题】:Grouping large sparse pandas dataframe with groupby.sum() is very slow使用 groupby.sum() 对大型稀疏 pandas 数据帧进行分组非常慢
【发布时间】:2020-03-11 08:40:48
【问题描述】:

我有大小为(607875, 12294) 的熊猫数据框。数据稀疏,看起来像:

     ID BB CC DD ...
0   abc 0  0  1  ...
1   bcd 0  0  0  ...
2   abc 0  0  1  ...
...

我通过调用将其转换为稀疏形式

dataframe = dataframe.to_sparse()

后来,我将其按IDsum 分组,并将行值按

dataframe = dataframe.groupby("ID").sum()

对于较小的数据帧,它工作得很好,但是对于这个大小,它工作了一个小时并没有完成工作。 有没有办法加快或绕过它?有没有其他我可以使用的稀疏方法,因为to_sparse 方法已被弃用。

输出数据框的大小为(2000, 12294),看起来像(如果abc 列中没有其他1):

     ID BB CC DD ...
0   abc 0  0  2  ...
1   bcd 0  0  0  ...
...

我的电脑上有 32 GB 的 RAM,所以应该足够了。

【问题讨论】:

  • 您可以添加示例输出数据框吗? @玛丽亚
  • 我建议融化,但我认为 DF 可能太大而无法放入内存。也许你可以看看dask
  • @Vishnudev,是的,当然。我编辑了问题。
  • 嗯...,我真的不习惯稀疏数据,但我可以想象 numpy 如何有效地对稀疏矩阵进行操作。但我无法想象稀疏数据帧上的groupby 是如何高效的。可以选择在密集版本上应用groupby 吗?
  • 你可能想探索dask

标签: python pandas group-by sparse-dataframe


【解决方案1】:

恐怕 Pandas 有其局限性,并且在 100MB - 1GB 的相对较小的数据集上效率最高。如果您只想使用 pandas,一种解决方法是从源中分块读取数据,这将减少数据帧。或者,如果可能,您可以为转换过滤掉不必要的列。

在其他地方,您应该检查更适合在较大数据集上进行转换的框架,例如 PySpark 或 Hadoop。

【讨论】:

    【解决方案2】:

    我知道这是反直觉的,但是在不调用稀疏的情况下遍历列会更快。试试下面的代码。

    df1 = df[['id', 'BB']].groupby(by='id').sum()
    for i in df.columns[2:]:
        df1[i] = df[['id', i]].groupby(by='id').sum()
        # if you want to save space you can drop df columns after they are added to df1
    

    【讨论】:

    • 您确定该代码可以工作吗?在第一步之后df 将只有两列。
    猜你喜欢
    • 2022-12-17
    • 2015-07-28
    • 2016-09-19
    • 2018-05-12
    • 2015-07-29
    • 1970-01-01
    • 1970-01-01
    • 2018-06-28
    • 2021-11-09
    相关资源
    最近更新 更多