Pandas:df.groupby()对于大数据集来说太慢了.任何替代方法吗?[英] Pandas: df.groupby() is too slow for big data set. Any alternatives methods?

本文是小编为大家收集整理的关于Pandas:df.groupby()对于大数据集来说太慢了.任何替代方法吗?的处理方法,想解了Pandas:df.groupby()对于大数据集来说太慢了.任何替代方法吗?的问题怎么解决?Pandas:df.groupby()对于大数据集来说太慢了.任何替代方法吗?问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我有一个pandas.dataframe,带有380万行和一列,我试图按索引分组它们.

索引是客户ID.我想通过索引组分组qty_liter:

df = df.groupby(df.index).sum()

但它需要永远完成计算.是否有任何替代方式来处理非常大的数据集?

这是df.info():

<class 'pandas.core.frame.DataFrame'>
Index: 3842595 entries, -2147153165 to \N
Data columns (total 1 columns):
qty_liter    object
dtypes: object(1)
memory usage: 58.6+ MB

数据如下所示:

在此处输入图像描述

推荐答案

问题是您的数据不是数字.处理字符串比处理号更长.首先尝试:

df.index = df.index.astype(int)
df.qty_liter = df.qty_liter.astype(float)
然后再次执行groupby().它应该更快.如果是,请参阅是否可以从头开始修改数据加载步骤以具有正确的DTypes.

其他推荐答案

您的数据被分类为太多类别,这是使groupby代码太慢的主要原因.我尝试使用Bodo了解它在大数据集中如何处理groupby.我用规则顺序熊猫和并行化BODO运行代码.熊猫大约需要20秒,只有5秒钟才能运行. Bodo基本上自动并行化Pandas代码,并允许您在多个处理器上运行它,您无法使用本机熊猫.它是最多的四个核心: https://docs.bodo.ai/latest/source/installation_and_setup/install.html

数据生成注意事项:我生成了一个具有2000万行和18个数字列的相对大的数据集.要使生成的数据更加常见于您的数据集,请添加另外两个名为"索引"和"QTY_LITER"的列.

#data generation

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(20000000, 18), columns = list('ABCDEFGHIJKLMNOPQR'))
df['index'] = np.random.randint(2147400000,2147500000,20000000).astype(str)
df['qty_liter'] = np.random.randn(20000000)

df.to_parquet("data.pq")

与常规熊猫:

import time
import pandas as pd
import numpy as np

start = time.time()
df = pd.read_parquet("data.pq")
grouped = df.groupby(['index'])['qty_liter'].sum()
end = time.time()
print("computation time: ", end - start)
print(grouped.head())

output:
computation time:  19.29292106628418
index
2147400000    29.701094
2147400001    -7.164031
2147400002   -21.104117
2147400003     7.315127
2147400004   -12.661605
Name: qty_liter, dtype: float64

与bodo:

%%px

import numpy as np
import pandas as pd
import time
import bodo

@bodo.jit(distributed = ['df'])
def group_by():
    start = time.time()
    df = pd.read_parquet("data.pq")
    df = df.groupby(['index'])['qty_liter'].sum()
    end = time.time()
    print("computation time: ", end - start)
    print(df.head())
    return df
    
df = group_by()

output:
[stdout:0] 
computation time:  5.12944599299226
index
2147437531     6.975570
2147456463     1.729212
2147447371    26.358158
2147407055    -6.885663
2147454784    -5.721883
Name: qty_liter, dtype: float64

免责声明:我是在Bodo.ai的数据师倡导工作

其他推荐答案

我不使用字符串,但是定义组的整数值.它仍然非常缓慢:大约3分钟的比例在萨特拉中的一小部分.观察的数量约为113K,由x,y,z定义的组数约为26k.

a= df.groupby(["x", "y", "z"])["b"].describe()[['max']]

x,y,z:整数值

b:实际值

本文地址:https://www.itbaoku.cn/post/1727958.html