1

我正在尝试使用 multiprocessing.Pool.starmap 根据其他几列的值,使用以下代码向我的熊猫数据框中添加一个新列:

def my_func(a, b, c, d, e, f):
    if pd.isna(b) or b == 0 or a == b:
        return c * f
    else:
        return e - d

with multiprocessing.Pool(processes=8) as pool:
    results = pool.starmap(my_func, zip(df["a"], df["b"], df["c"], df["d"], df["e"], repeat(12)))

df["new_col"] = results

使用具有 200.000 行的数据框运行此代码非常有效,并且只需不到 5 秒。用 2.000.000 行再次尝试它似乎被卡住并且永远不会完成。a & b 列是字符串,c、d、e 是浮点数,以防万一。

从 CPU 利用率来看,它们似乎也几乎没有工作。

谁能建议为什么会发生这种情况/如何改进解决方案运行时?

更新:使用 df.parallel_apply(lambda row: my_func(...), axis=1) 而不是 multiprocessing.Pool 切换到 pandarallel

4

0 回答 0