python - 将多重处理应用于 pandas 数据框中独特条目类别的最有效方法是什么?

标签 python python-3.x pandas multiprocessing sklearn-pandas

我有一个大型数据集(tsv),看起来像这样:

category     lat         lon  
apple        34.578967   120.232453  
apple        34.234646   120.535667  
pear         32.564566   120.453567  
peach        33.564567   121.456445  
apple        34.656757   120.423566  

总体目标是将包含单个类别的所有记录的数据帧传递给 DBScan 以生成集群标签,并使用多处理模块对所有类别执行此操作。我可以让它工作,但我目前正在每个进程中重新加载整个数据集,以便将其子集到类别中,因为在尝试将整个数据集引用为全局变量时,我继续收到错误。代码如下所示:

import pandas as pd
from sklearn.cluster import DBSCAN
import multiprocessing as mp

def findClusters(inCat):
    inTSV = r"C:\trees.csv"
    clDF = pd.read_csv(inTSV, sep='\t')
    catDF = clDF[clDF['category'] == 'inCat']
    kms = 0.05
    scaleDist = 0.01*kms
    x = 'lon'
    y = 'lat'
    dbscan = DBSCAN(eps=scaleDist, min_samples=5)
    clusters = dbscan.fit_predict(catDF[[x,y]])
    catDF['cluster'] = clusters
    catDF.to_csv(r"C:\%s.csv" % (inCat))
    del catDF

if __name__ == "__main__":

    inTSV = r"C:\trees.csv"
    df = pd.read_csv(inTSV, sep='\t')

    catList = list(df.category.unique())

    cores = mp.cpu_count()
    pool = mp.Pool(cores - 1)
    pool.map(findClusters, catList)
    pool.close()
    pool.join()

我知道这不是最有效的方法,因为我正在重读并写入中间文件。我想并行运行每类数据的聚类。我可以构建一个数据帧列表(每个类别一个)来为多处理池提供数据吗?处理后如何捕获这些所有内容(包装在 concat 调用中?)。有没有更好的方法将数据一次加载到内存中,并让每个进程都能够访问它以切出它需要的类别数据,如何?

运行 Anaconda,Python 3.5.5

感谢您的见解。

最佳答案

您可以使用df.groupby,因此请注意:

In [1]: import pandas as pd

In [2]: df = pd.read_clipboard()

In [3]: df
Out[3]:
  category        lat         lon
0    apple  34.578967  120.232453
1    apple  34.234646  120.535667
2     pear  32.564566  120.453567
3    peach  33.564567  121.456445
4    apple  34.656757  120.423566

In [4]: list(df.groupby('category'))
Out[4]:
[('apple',   category        lat         lon
  0    apple  34.578967  120.232453
  1    apple  34.234646  120.535667
  4    apple  34.656757  120.423566),
 ('peach',   category        lat         lon
  3    peach  33.564567  121.456445),
 ('pear',   category        lat         lon
  2     pear  32.564566  120.453567)]

只需重写您的函数以期望一对,例如:

def find_clusters(grouped):
    cat, catDF = grouped
    kms = 0.05
    scale_dist = 0.01*kms
    x = 'lon'
    y = 'lat'
    dbscan = DBSCAN(eps=scale_dist, min_samples=5)
    clusters = dbscan.fit_predict(catDF[[x,y]])
    catDF['cluster'] = clusters
    catDF.to_csv(r"C:\%s.csv" % (cat))

老实说,我认为写入中间文件很好。

如果没有,您可以随时这样做:

return catDF

而不是

catDF.to_csv(r"C:\%s.csv" % (cat))

然后:

df = pd.concat(pool.map(findClusters, catList))

关于python - 将多重处理应用于 pandas 数据框中独特条目类别的最有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51932319/

相关文章:

python - 如何使用 QFileDialog 选项并检索 saveFileName?

python-3.x - Python - 结构包错误

python - Bokeh 数据表在行和网格图中重叠

Python:在运行时更改方法和属性

python - 从子目录中复制特定扩展名的文件并将其放置到具有相同结构的新子目录中

python - 如何在 tkinter python 中的按钮小部件的命令属性中使用 lambda 表达式调用回调函数

python - Pandas:按列分组时获取滚动总和

python - 对每一行的 pandas 列进行排序

python - 在Python中从月-年生成该月的最后一天

python - 在当前 visual studio 2013 中运行 visual studio 2008