You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python的Parallel与delayed函数无法获取两个DataFrame输出的问题

问题:多进程返回多变量时触发ValueError

我在Python中用joblib实现并行处理,代码如下:

import pandas as pd
import multiprocessing
from joblib import Parallel, delayed
from tqdm import tqdm

num_cores = multiprocessing.cpu_count()

df = pd.DataFrame([["A",5],["B",4],["C",7]],columns=["item","val"])
inputs = ["A","B"]

def my_function(inputs):
    for unique_id in inputs:
        df3 code
        df4 code
    return (df3,df4)

if __name__ == "__main__":
    df3,df4 = Parallel(n_jobs=num_cores)(delayed(my_function)(i) for i in inputs)

执行时出现错误:ValueError: not enough values to unpack (expected 2, got 1),但把结果保存为CSV时能得到df3和df4,请问原因和解决方法?


错误原因

  1. 函数逻辑与参数不匹配:你的my_function参数名是inputs,但调用时传入的是单个元素("A"或"B"),函数内部的for unique_id in inputs会遍历单个字符串的字符(比如"A"只会循环一次),这和你预期的处理每个item的逻辑不符,而且函数最终返回的是单次循环的结果,而非并行处理后的集合。
  2. 对Parallel返回结构理解错误:Parallel(...)返回的是一个列表,长度等于inputs的元素数量(这里是2),每个列表元素是my_function返回的(df3, df4)元组。你直接用df3, df4 = Parallel(...),相当于试图把列表的2个元素分别赋值给两个变量,每个变量会是一个元组,而非你想要的合并后的DataFrame,这就触发了解包错误。

解决方法

1. 修正函数逻辑,让函数处理单个输入

把函数改成接收单个unique_id,去掉内部循环(Parallel会自动遍历inputs中的每个元素分配给进程):

def my_function(unique_id):
    # 示例逻辑:根据unique_id筛选数据并处理
    df3 = df[df["item"] == unique_id].copy()
    df4 = df3.assign(val_double=lambda x: x["val"] * 2)  # 示例处理
    return (df3, df4)

2. 正确解析Parallel的返回结果

先收集所有进程的返回结果,再拆分合并对应的DataFrame:

if __name__ == "__main__":
    # 获取所有并行任务的结果:[(df3_A, df4_A), (df3_B, df4_B)]
    results = Parallel(n_jobs=num_cores)(delayed(my_function)(i) for i in inputs)
    
    # 拆分结果列表,分别收集df3和df4
    df3_list = [res[0] for res in results]
    df4_list = [res[1] for res in results]
    
    # 合并成最终的DataFrame
    df3_combined = pd.concat(df3_list, ignore_index=True)
    df4_combined = pd.concat(df4_list, ignore_index=True)
    
    # 后续操作:保存或使用合并后的结果
    df3_combined.to_csv("df3.csv", index=False)
    df4_combined.to_csv("df4.csv", index=False)

内容的提问来源于stack exchange,提问作者Chethan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 01:54:59