栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Python:对熊猫数据框使用多处理

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Python:对熊猫数据框使用多处理

怎么了

您的代码中的这一行:

pool.map(calc_dist, ['lat','lon'])

产生2个进程-
一个运行

calc_dist('lat')
,另一个运行
calc_dist('lon')
。比较doc中的第一个示例。(基本上,
pool.map(f,[1,2,3])
调用
f
在下面的列表中给出的参数三次
f(1)
f(2)
f(3)
)。如果我没有记错的话,你的函数
calc_dist
只能叫
calc_dist('lat','lon')
。而且它不允许并行处理。

我相信您希望将工作拆分到多个进程之间,可能将每个元组发送

(grp, lst)
到一个单独的进程。以下代码正是这样做的。

首先,让我们准备拆分:

grp_lst_args = list(df.groupby('co_nm').groups.items())print(grp_lst_args)[('aa', [0, 1, 2]), ('cc', [7, 8, 9]), ('bb', [3, 4, 5, 6])]

我们将在单独的进程中将每个元组(这里有三个)作为参数传递给函数。我们需要重写函数,我们称它为

calc_dist2
。为了方便起见,它的参数是一个元组,如
calc_dist2(('aa',[0,1,2]))

def calc_dist2(arg):    grp, lst = arg    return pd.Dataframe(    [ [grp,       df.loc[c[0]].ser_no,       df.loc[c[1]].ser_no,       vincenty(df.loc[c[0], ['lat','lon']],      df.loc[c[1], ['lat','lon']])      ]      for c in combinations(lst, 2)    ],    columns=['co_nm','machineA','machineB','distance'])

现在是多重处理:

pool = mp.Pool(processes = (mp.cpu_count() - 1))results = pool.map(calc_dist2, grp_lst_args)pool.close()pool.join()results_df = pd.concat(results)

results
是结果的通话清单(此处数据帧)
calc_dist2((grp,lst))
(grp,lst)
grp_lst_args
。的元素
results
随后被连接到一个数据帧。

print(results_df)  co_nm  machineA  machineB          distance0    aa         1         2  156.876149391 km1    aa         1         3  313.705445447 km2    aa         2         3  156.829329105 km0    cc         8         9  156.060165391 km1    cc         8         0  311.910998169 km2    cc         9         0  155.851498134 km0    bb         4         5  156.665641837 km1    bb         4         6  313.214333025 km2    bb         4         7  469.622535339 km3    bb         5         6  156.548897414 km4    bb         5         7  312.957597466 km5    bb         6         7   156.40899677 km

顺便说一句,在Python 3中,我们可以使用以下

with
构造:

with mp.Pool() as pool:    results = pool.map(calc_dist2, grp_lst_args)

更新资料

我仅在linux上测试了此代码。在Linux上,

df
子进程可以访问只读数据帧,并且不会将其复制到其内存空间中,但是我不确定它在Windows上如何正常工作。您可以考虑将其拆分
df
为多个块(按分组
co_nm
),然后将这些块作为参数发送给的其他版本的
calc_dist



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/516905.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号