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

Python使用并行处理填充DataFrame列的报错问题求解

错误原因

  • 多进程存在内存隔离,子进程获取的是主进程DataFrame的独立副本,在子进程内修改DataFrame不会同步到主进程,原逻辑完全无法实现预期赋值效果
  • 原索引写法df.loc[A,B,C]['Output']属于链式索引,会触发pandas的SettingWithCopy警告,无法完成赋值
  • 创建MultiIndex时使用集合{"a", "b", "c"}作为names参数,集合是无序结构,可能导致索引名顺序错乱
  • 每个子进程返回完整DataFrame会产生大量冗余数据,额外占用内存和IO资源

修复方案

调整实现逻辑,多进程仅负责纯计算,最终由主进程统一完成赋值,避免跨进程操作共享对象,修复后的可运行代码如下:

import itertools
import pyblaze.multiprocessing as xmp
import pandas as pd

inputs = [range(2), range(2), range(3)]
inputs_list = list(itertools.product(*inputs))
# 用有序列表定义索引名,避免顺序错乱
Index = pd.MultiIndex.from_tuples(inputs_list, names=["a", "b", "c"])
df = pd.DataFrame(index = Index)

# 计算函数仅做纯运算,不操作共享DataFrame
def Addition(A,B,C):
    return A + B + C

def parallel(inputs_list):
    tokenizer = xmp.Vectorizer(Addition, num_workers=8)
    return tokenizer.process(inputs_list)

# 并行得到所有结果后,批量赋值到DataFrame(参数顺序和索引顺序完全一致,可直接赋值)
df['Output'] = parallel(inputs_list)
print(df)

如果计算逻辑和索引顺序无法一一对应,可以调整计算函数返回索引和对应值,主进程再逐个赋值:

def Addition(A,B,C):
    return (A,B,C), A+B+C

# 并行计算完成后遍历赋值
results = parallel(inputs_list)
for idx, val in results:
    df.loc[idx, 'Output'] = val

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 02:57:02