【问题标题】:Improving groupby() performance提高 groupby() 性能
【发布时间】:2022-01-06 15:52:45
【问题描述】:

原始数据框为:

import pandas as pd
array = {'id': [1, 1, 1, 1, 2, 3],
         'color': ['yellow', 'red', 'yellow', 'red', 'yellow', 'white']}
df = pd.DataFrame(array)
df

id          color
1           yellow
1           red
1           yellow
1           red
2           yellow
3           white

我已使用 get_dummies 将其转换为以下数据框:

df = pd.get_dummies(df, prefix='', prefix_sep='')
df

   id  red  white  yellow
0   1    0      0       1
1   1    1      0       0
2   1    0      0       1
3   1    1      0       0
4   2    0      0       1
5   3    0      1       0

我要 groupby() 列'id':

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

    red  white  yellow
id                    
1     1      0       1
2     0      0       1
3     0      1       0

但是,我的原始数据框是 8,000 行 x 1,500,000 列,这使得这个操作太慢了。

关于如何使其更快的任何想法?

【问题讨论】:

  • 你的数据框非常宽的数据模型是什么?
  • 数据模型是什么意思?
  • 8000 行中有多少组?
  • 我更新了答案
  • 这有帮助吗: : df.groupby([*df]).size().clip(upper=1).unstack('color', fill_value=0)

标签: python pandas group-by pandas-groupby


【解决方案1】:

更新

根据您的原始数据框,我将在以后对数据框进行唯一化并对其进行透视(或热编码)。这样,您就可以完全避免任何后续聚合。

df_unique = df.drop_duplicates()
df_unique["val"] = 1
df_unique
    id  color   val
0   1   yellow  1
1   1   red     1
4   2   yellow  1
5   3   white   1

df_unique.set_index("id").pivot(columns="color").fillna(0)
    red     white   yellow
id          
1   1.0     0.0     1.0
2   0.0     0.0     1.0
3   0.0     1.0     0.0

编码替代方案

请尝试重塑您的数据(这也很耗时),但可能比您当前的宽格式更快:

# first approach using melt.groupby.max 
pd.melt(df, id_vars = 'id').groupby(["id", "variable"]).max()

# second approach using melt.sort.groupby.first
pd.melt(df, id_vars = 'id').sort_values(by="variable", ascending=True).groupby(["id", "variable"]).first()

您可以在之后运行它以再次保留所需的形状:

melted_and_aggregated_df.reset_index(level=["variable"]).pivot(columns=["variable"], values="value")

数据大小

除了纯粹的编码效率,尽量减少你的数据。

  • 如果某些组只有一行,则应仅对其他组使用 max/first 方法,然后再合并结果。
  • 实际上有 150 万种颜色吗?听起来很大。您真的需要所有这些,还是可以事先减少/聚合?

【讨论】:

  • 谢谢!!!你确定融化更快吗?将其应用于我在上面发布的短数据帧时,原始 groupby() 需要 1 毫秒时需要 3 毫秒
  • 颜色只是一个例子。现实世界的数据编码不同
  • 不,我不确定。这只是解决这个问题的另一种方法。主要重点应该是在聚合之前减少数据。考虑到大数据量,我怀疑有一个选项会非常快
  • 不...熔化不应该更快,您正在扩展行数,这不会提供任何效率。我建议比 groupby 更快的解决方案应该是减少行数并允许对列进行矢量化操作
  • 你能否分享原始数据框,分享你的最终预期输出
猜你喜欢
  • 1970-01-01
  • 2021-08-12
  • 2023-03-13
  • 1970-01-01
  • 2022-11-14
  • 1970-01-01
  • 2019-09-08
  • 2021-10-31
  • 1970-01-01
相关资源
最近更新 更多