распараллелить обновление колонок панд - PullRequest
0 голосов
/ 11 июля 2019

Мне нужно обновить столбец данных pandas на основе обработки списка выбранных значений (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])

1 Ответ

0 голосов
/ 11 июля 2019

Вы можете использовать Пул , предоставленный в мультипроцессоре для распараллеливания.

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 () , поскольку map () блокируется.В целом логика распараллеливания остается прежней.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...