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

为什么将pandas DataFrame传入多进程函数后原数据没有变化

问题原因

  • Python multiprocessing 模块默认采用进程隔离的运行模式:父进程启动子进程时,会将传入的参数序列化后拷贝到子进程的独立内存空间中,子进程对参数的所有修改都只会作用于本地副本,不会反向同步到父进程的原始变量。
  • 你当前的changeDF函数没有返回值,只是直接修改传入的DataFrame对象,所有修改都只发生在子进程的副本上,父进程的df1、df2自然不会有变化。

解决方案

最简单的适配方案是修改函数逻辑,将修改后的DataFrame作为返回值传回父进程,父进程接收返回值后替换原变量即可,示例代码如下:

import multiprocessing
import pandas as pd

df1 = pd.DataFrame(
    {
        "A": ["A0", "A1", "A2", "A3"],
        "B": ["B0", "B1", "B2", "B3"],
        "C": ["C0", "C1", "C2", "C3"],
        "D": ["D0", "D1", "D2", "D3"],
    }
)
df2 = pd.DataFrame(
    {
        "A": ["A4", "A5", "A6", "A7"],
        "B": ["B4", "B5", "B6", "B7"],
        "C": ["C4", "C5", "C6", "C7"],
        "D": ["D4", "D5", "D6", "D7"],
    }
)

# 修改函数,返回处理后的df
def changeDF(df):
    df['Signal'] = 0
    return df

if __name__ == '__main__': # Windows平台必须加这行防止多进程无限递归启动
    s = [df1, df2]
    with multiprocessing.Pool(processes=2) as pool:
        res = pool.map(changeDF, s)
    # 用返回的结果替换原变量
    df1, df2 = res

补充说明:如果处理的DataFrame体积很大,反复拷贝会占用过多内存,可以考虑使用multiprocessing.Array等共享内存结构存储数据,避免跨进程拷贝,但实现复杂度更高,常规场景下直接返回处理结果的方案更易用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 21:36:03