如何在多处理中更新数据框值

时间:2019-01-30 11:49:26

标签: python pandas multiprocessing

我要更新熊猫

您好,我想比较熊猫数据帧计算中单核和多核的速度。 给出以下情况:第i行的'c'列是从'i-9'行到'i'行的'a'值的平均值。

from multiprocessing import Process, Value, Array, Manager
import pandas as pd
import numpy as np
import time 

total_num = 1000
df = pd.DataFrame(np.arange(1,total_num*2+1).reshape(total_num,2),
              columns=['a','b'])
df['c']=0


df2 = pd.DataFrame(np.arange(1,total_num*2+1).reshape(total_num,2),
              columns=['a','b'])
df2['c']=0


def Cal(start, end):
    for i in range(end-start-1):
        if i+start < 10:
            df.loc[i+start,'c']=df.loc[:i+start,'c'].mean()
        else :
            df.loc[i+start,'c']=df.loc[i-9:i+start,'c'].mean()

def Cal2(my_df,start, end):
    for i in range(end-start-1):
        if i+start < 10:
            my_df.df.loc[i+start,'c']=my_df.df.loc[:i+start,'c'].mean()
        else :
            my_df.df.loc[i+start,'c']=my_df.df.loc[i-9:i+start,'c'].mean()
    print(my_df)

print('Single core : --->')
start_t = time.time()

Cal(0,total_num+1)

end_t = time.time()
print(end_t-start_t)

print('Multiprocess ---->')

if __name__=='__main__':
    num=len(df2)
    num_core=4 
    between=num//num_core

    mgr=Manager()
    ns = mgr.Namespace()
    ns.df=df2
    procs=[]

    start_t =time.time()

    for index in range(num_core):
        proc=Process(target=Cal2,args=(ns,index*between,(index+1)*between))
        procs.append(proc)
        proc.start()

    for proc in procs:
        proc.join()

    end_t = time.time()
    print(end_t-start_t)

起初,我意识到Multiprocessing不使用全局变量。所以我用了经理。但是,df2的“ c”列没有更改。

我该怎么做? :p

1 个答案:

答案 0 :(得分:0)

您也可以看看swifter,它会通过多处理应用功能如果有助于更快地执行代码

对于您而言,这是一个糟糕的主意,因为10个数据确实很少,因此在内核之间分配数据将无济于事,并且流程成本将比运营成本高得多。

此外,在进程之间共享内存不是一个好主意(因为这确实很昂贵),而这就是您要在此处进行的操作(通常是事先拆分数据并将其推送到applymap之类的多处理函数中,但同样,数据块应该更大)。

您可以使用threads,因为您可能会使用它们,但是请记住Python的GIL(您可能会在其他答案中了解线程,进程和GIL,例如{{3} })