您的数据分类太多,这是导致groupby 代码太慢的主要原因。我尝试使用 Bodo 来查看它如何处理大型数据集上的 groupby。我使用常规的顺序 Pandas 和并行化的 Bodo 运行代码。 Pandas 用了大约 20 秒,Bodo 只用了 5 秒。 Bodo 基本上会自动并行化您的 Pandas 代码,并允许您在多个处理器上运行它,这是原生 pandas 无法做到的。最多可免费使用四个内核:https://docs.bodo.ai/latest/source/installation_and_setup/install.html
数据生成注意事项:我生成了一个比较大的数据集,有 2000 万行和 18 个数值列。为了使生成的数据更类似于您的数据集,添加了另外两个名为“index”和“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
与博多:
%%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 工作的数据科学家倡导者