为啥当我将熊猫数据框用作具有多处理功能的函数的输入时它不会改变

Posted

技术标签:

【中文标题】为啥当我将熊猫数据框用作具有多处理功能的函数的输入时它不会改变【英文标题】:Why pandas dataframe doesn't change when i used it as a input of a function with multiprocessing为什么当我将熊猫数据框用作具有多处理功能的函数的输入时它不会改变 【发布时间】:2021-12-31 01:19:59 【问题描述】:

我有这样的代码:

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"],
    
)

def changeDF(df):
    df['Signal'] = 0

changeDF(df1)
changeDF(df2)

当我在上面运行时,(changeDf) 函数向 df1 和 df2 添加一个名为“Signal”的列,其值为 0。但不是像下面那样直接使用多处理运行 (changeDf) 它不会更改任何 dfs。

s = [df1, df2]
with multiprocessing.Pool(processes=2) as pool:
    res = pool.map(changeDF, s)

我的代码有什么问题?

【问题讨论】:

更改您的函数以返回修改后的数据框 【参考方案1】:

为多处理序列化df1df2 意味着您正在制作副本。

从函数中返回您的数据框,它会正常工作。

def changeDF(df):
    df['Signal'] = 0
    return(df)

with multiprocessing.Pool(processes=2) as pool:
    df1, df2 = pool.map(changeDF, [df1, df2])

我会警告您,这样做的序列化成本肯定会高于您从多处理中获得的收益。

【讨论】:

你可以做df1, df2 = pool.map(changeDF, [df1, df2])。行首不需要括号[df1, df2] 感谢您的好意。我正在寻找一种方法来并行化我的计算而不复制我的数据帧的新版本,因为这些是非常大的数据帧,并且复制可能会遇到 RAM 问题。您有什么想法可以在不复制这些内容的情况下并行计算吗? 您应该查看为此目的构建的库。我建议dask。【参考方案2】:

把你的函数changeDF改成这样:

def changeDF(df):
    df['Signal'] = 0
    return df

【讨论】:

以上是关于为啥当我将熊猫数据框用作具有多处理功能的函数的输入时它不会改变的主要内容,如果未能解决你的问题,请参考以下文章

将熊猫数据框转换为numpy数组[重复]

如何按月份和年份输入过滤具有日期时间索引的数据框?熊猫

如何将*多个*功能应用于熊猫 groupby 应用?

如何在熊猫数据框中使用应用时创建列时间戳?

具有多列的熊猫每组的最大值/为啥它仅在展平时才有效?

每次合并具有不同列名的熊猫数据框列表