joblib并向dataframe添加新行

2024-04-26 11:15:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我定义以下函数来更新我的日期框

def func(idx,value):
    if idx in df.index:
        df.loc[idx] += value
    else:
        df.loc[idx] = value

然后,我使用joblib进行并行循环

Parallel(n_jobs=-1)(delayed(func)(idx, value) for idx, value in key(df2.name,df.score))

例如,我有两个数据帧:

name    score
john    10

name    score
john    10
chris   20
chris   10

然后,我希望我的函数将第一个数据帧更新为

name    score
john    20
chris   30

然后,我得到一个错误,说赋值目的地是只读的。我认为这是因为我试图在并行计算时向数据帧添加新行

有什么办法可以四处走动吗?我也愿意接受除并行循环之外的任何其他建议,比如使用cudf的gpu计算(不确定循环的速度是否会加快)


Tags: 数据函数nameindfif定义value
1条回答
网友
1楼 · 发布于 2024-04-26 11:15:48

您可以对dataframe进行分组并在组上迭代,将每个组传递给函数,并将函数的结果存储到一个列表中,您可以在最后连接该列表

这里我们有一些名字和年龄,我们将按年龄分组并传递一个并行函数,取平均值并将结果返回到一个列表中,该列表被连接为最终产品

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

df = pd.DataFrame({'name':['john','john','chris','chris'],
                  'age':[23,46,32,56]})

def applyParallel(dfGrouped, func):

    retLst = Parallel(n_jobs=multiprocessing.cpu_count())(delayed(func)(name, data) for name, data in dfGrouped)

    return pd.concat(retLst)


def my_function(name,data):
    ### Process data here
    data = data.groupby('name').mean()
    return data

# Group by some column in your dataframe
output = applyParallel(df.groupby(['name']), my_function)

输出

         age
name    
chris   44.0
john    34.5

相关问题 更多 >