【问题标题】:parallelize pandas column update并行化 pandas 列更新
【发布时间】:2019-07-11 11:10:30
【问题描述】:

我需要根据所选值列表的处理来更新熊猫数据框的列(下面的代码中的df0['parcels'].values)。该代码运行良好,但很长,因为所选值的列表相当长,有 45000 个值。此代码需要 5 小时才能完成任务。

因为对每个选定值的处理是独立的。我想尝试并行化它以提高速度。

import numpy as np
import pandas as pd
from scipy.ndimage import distance_transform_edt as edt

for i in df0['parcels'].values:
    y, x = np.where(parcels == i)
    tmp = parcels[np.min(y) - 5:np.max(y) + 6, np.min(x) - 5:np.max(x) + 6]
    dst = edt(tmp, sampling=r_parcels)
    par = tmp[dst <= 20]
    par = par[par != -9999]
    mod, cnt = ss.mode(par)
    df['parcels'] = df['parcels'].replace(i, mod[0])

【问题讨论】:

  • 我们能否有重复的宗地值,这些值可能在不同的迭代中重叠?
  • @RomanPerekhrest:不,“df0['parcels'].values”中的每个值都是唯一的。 df0['parcels'].values 的每个值都是 1 到 3 个像素,搜索范围 (par = tmp[dst ) df0['parcels'].values 中的值不能是 df0['parcels'].values 中另一个值的模式。

标签: python pandas numpy parallel-processing


【解决方案1】:

您可以使用 multiprocessing 中提供的 Pool 进行并行化。

import numpy as np
import pandas as pd
from scipy.ndimage import distance_transform_edt as edt

import multiprocessing as mp

def func(i): # change the body of the loop to function
    y, x = np.where(parcels == i)
    tmp = parcels[np.min(y) - 5:np.max(y) + 6, np.min(x) - 5:np.max(x) + 6]
    dst = edt(tmp, sampling=r_parcels)
    par = tmp[dst <= 20]
    par = par[par != -9999]
    mod, cnt = ss.mode(par)
    return (df['parcels'].replace(i, mod[0]))

num_workers = mp.cpu_count()  
pool = mp.Pool(num_workers)
df['parcels'] = pool.map(func,df0['parcels'].values) # specify the function and arguments to map 
pool.close()
pool.join()

您也可以使用 pool.map_async()pool.apply_async(),因为 ma​​p() 会阻塞。并行化的一般逻辑保持不变。

【讨论】:

  • 谢谢,这正是我想要的。我更了解如何进行多处理。
猜你喜欢
  • 2016-09-05
  • 2017-03-14
  • 1970-01-01
  • 2017-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-18
  • 1970-01-01
相关资源
最近更新 更多