通过和应用声明提高熊猫的速度或替换熊猫



我有一个几百万行的中等大小的数据帧,我发现按组对列求和非常慢。我使用以下代码:

# Function to sum costs and utility for each patient
def calculate_on_group(x):
return pd.Series(x.sum(), index=x.index)
summary_df['cost'] = output_df.groupby(['id', 'run'])['cost'].apply(calculate_on_group)

这是因为我有很多团体。对于run的每个值,id有10000个不同的值,即每个运行值有10000个组。run本身包含数百个不同的值。两列都是整数。

我读到过,对于中等规模的数据和许多组,最好不要同时使用groupby()apply的组合,但我还不知道该使用什么。你们有什么建议吗?

您应该使用pandassum方法,它将更高效,因为它将同时向量化所有计算。

当您定义自己的聚合函数(此处为calculate_on_group(时,它会在每个子组上独立调用,这在Python中非常缓慢。尽可能始终使用矢量化操作。

下面的片段几秒钟后就会在我的笔记本电脑上运行。

import numpy as np
import pandas as pd
n = 10_000_000
output_df = pd.DataFrame({
"id": np.random.randint(10_000, size=n),
"run": np.random.randint(1000, size=n),
"cost": np.random.random(size=n)
})
summary_df = output_df.groupby(["id", "run"])["cost"].sum()

您可能想阅读pandas关于分组的文档,尤其是这段关于基于C的聚合方法的文档,以避免将来出现这些性能问题。

最新更新