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
相关产品推荐
相关产品推荐

