我有一个大数据框架,我想在其中一列中删除HTML标签。因此,我使用BeautifulSoup和A用于循环进行这项工作,并且效果很好。这样:
import pandas as pd
from bs4 import BeautifulSoup
d = {'name': ['alan', 'bob', 'charle', 'dean'],
'age':['23', '43', '56', '23'],
'content': ['<p>test</p>', '<div>foo</div>', '<span>bar</span>',
'<div class='test'>test2</div>']}
data = pd.DataFrame(d)
for i in range(1, 10000):
data.ix[i, 'content'] = BeautifulSoup(data.ix[i, 'content'],
'lxml').get_text()
现在我想通过多处理加速,这样:
from multiprocessing import Pool
def work(n):
data.ix[n, 'content'] = BeautifulSoup(data.ix[n, 'content'], 'lxml').get_text()
with Pool() as p:
p.map(work, range(1, 1000))
多处理似乎有效,因为我的CPU负载达到100%,但列没有更改。
我想念什么吗?否则它只是不起作用?
线程内部进行的更改不是全局,这意味着您使用multiprocessing
进行的任何更改都会不是更改数据。
取而代之的是,您可以(并且应该)在整个线程上分区工作,并使work()
函数返回数据分区的新修改版本,然后将(串联)组合(Concatenate)修改后的零件。
最初从这里拍摄,此代码将执行您想要的事情:
import numpy as np
from multiprocessing import cpu_count,Pool
def work(data_part):
data_part.content = data_part.content.map(lambda c: BeautifulSoup(c, 'lxml').get_text())
return data_part
cores = cpu_count() #Number of CPU cores on your system
partitions = cores #Define as many partitions as you want
def parallelize(data, func):
data_split = np.array_split(data, partitions)
pool = Pool(cores)
data = pd.concat(pool.map(func, data_split))
pool.close()
pool.join()
return data
data = parallelize(data,work)