首页 > 解决方案 > 如何通过列中的给定值加速循环子集DataFrame并在Python中应用公式

问题描述

我想知道是否有办法加快这段代码:


alphas = []

origins = flows["OrigCodeNew"].unique()

for origin in origins:
    df = flows[flows["OrigCodeNew"] == origin]
    alpha = sum(df["DestSal"] ** gamma * df["Dist"] ** beta])
    alphas.append(1/alpha)

alphas = pd.DataFrame(zip(origins, alphas), columns = ["OrigCodeNew", "alpha"])

其中输入是以下形式的 DataFrame:

OrigCodeNew   Destination  DestSal Dist
A             C            20000   6
A             D            30000   8
A             E            25000   10 
A             F            35000   2
B             C            20000   7
B             D            30000   5
B             E            25000   20
B             F            35000   13

输出:

OrigCodeNew  Alpha (example)
A            0.034
B            0.064 

我知道这是低效的代码,可以加快速度,但我不确定如何。我已经使用了一段时间并且它有效,但我正在尝试重构代码以使其更高效。我试图用 agg 函数找出 pandas.groupby ,但还没有弄清楚如何用这种方程来做。任何意见,将不胜感激。

标签: pythonpandasdataframepandas-groupby

解决方案


您没有提供任何样本数据或预期输出,因此很难回答这个问题。

从理论上讲,您应该能够分组然后使用变换,这会将组值分配给组中的每一行。如果您更习惯使用 agg,您可以计算组值,然后加入原始数据框和“OrigCodeNew”上的聚合。

(
  flows
  .groupby('OrigCodeNew')
  .transform(alpha=lambda x: 1 / (sum(x.DestSal ** gamma * x.Dist ** beta)))
)

推荐阅读