Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 与dask并行读取处理和连接数据帧_Python_Pandas_Multiprocessing_Dask - Fatal编程技术网

Python 与dask并行读取处理和连接数据帧

Python 与dask并行读取处理和连接数据帧,python,pandas,multiprocessing,dask,Python,Pandas,Multiprocessing,Dask,我正在尝试并行读取和处理csv文件列表,并将输出连接到一个pandas数据帧中进行进一步处理 我的工作流程包括3个步骤: 通过读取csv文件列表(所有文件都具有相同的结构)创建一系列数据帧 def loadcsv(文件名): df=pd.read\u csv(文件名) 返回df 对于每个数据帧,通过处理2个现有列来创建一个新列 def makegeom(a,b): 返回“点(%s%s)”(a,b) def applygeom(df): df['Geom']=df.apply(lambda行

我正在尝试并行读取和处理csv文件列表,并将输出连接到一个
pandas数据帧中进行进一步处理

我的工作流程包括3个步骤:

  • 通过读取csv文件列表(所有文件都具有相同的结构)创建一系列数据帧

    def loadcsv(文件名):
    df=pd.read\u csv(文件名)
    返回df
    

  • 对于每个数据帧,通过处理2个现有列来创建一个新列

    def makegeom(a,b):
    返回“点(%s%s)”(a,b)
    

    def applygeom(df):
    df['Geom']=df.apply(lambda行:makegeom(行['Easting']),
    第['Northing']行),
    轴=1)
    返回df
    

  • 在单个数据帧中连接所有数据帧

    df['geom'] = df[['a', 'b']].apply(makegeom)
    
    frames=[]
    对于csvtest中的i:
    df=applygeom(加载CSV(i))
    frames.append(df)
    mergedresult1=pd.concat(帧)
    

在我的工作流程中,我使用熊猫(每个csv(15)文件有超过>>2*10^6个数据点),因此需要一段时间才能完成。我认为这种工作流应该利用一些并行处理(至少对于
read_csv
apply
步骤),因此我尝试了dask,但无法正确使用它。在我的尝试中,我的速度没有得到任何提高

我制作了一个简单的笔记本,以便复制我正在做的事情:

我的问题是。。。使用dask完成用例的正确方法是什么?

在熊猫中,我会使用apply方法

In [1]: import pandas as pd

In [2]: df = pd.DataFrame({'a': [1, 2, 3], 'b': [3, 2, 1]})

In [3]: def makegeom(row):
   ...:      a, b = row
   ...:      return 'Point(%s %s)' % (a, b)
   ...: 

In [4]: df.apply(makegeom, axis=1)
Out[4]: 
0    Point(1 3)
1    Point(2 2)
2    Point(3 1)
dtype: object
数据帧 在dask.dataframe中,您可以执行相同的操作

In [5]: import dask.dataframe as dd

In [6]: ddf = dd.from_pandas(df, npartitions=2)

In [7]: ddf.apply(makegeom, axis=1).compute()
Out[7]: 
0    Point(1 3)
1    Point(2 2)
2    Point(3 1)
添加新系列 在任何一种情况下,您都可以将新系列添加到数据帧中

df['geom'] = df[['a', 'b']].apply(makegeom)
创造 如果您有CSV数据,那么我将使用dask.dataframe.read_CSV函数

ddf = dd.read_csv('filenames.*.csv')

如果您有其他类型的数据,那么我将使用

同时,我发现了其他方法(Dask的替代方法),在我看来,相对更容易,在一个数据帧上并行执行函数
func
。在这两种情况下,我都利用了这种方法

其中一个使用python
多处理.Pool
的组合,并将以以下方式工作:

将numpy导入为np
def func(数组):
#对给定的数组进行一些计算
通过
def并行化数据帧(df、func、n_核心=72):
df_split=np.数组_split(df,n_核)
池=池(n_芯)
df=pd.concat(pool.map(func,df_split))
pool.close()
pool.join()
返回df
另一种方法是使用功能强大但简单的集群(如果您可以在多台机器上运行代码,这非常有用):


上述方法对于简单方法
func
非常有效,其中可以使用numpy执行计算,返回的产品可以连接回pandas数据帧-对于执行更简单文件操作的方法,我还发现它非常有用
parmap.map
,但对于本S.O.来说,这不是主题。问题。

我现在尝试使用延迟:但它仍在工作…“htop”显示所有cpu都在工作,但不是100%工作。我看到8个进程在15%左右工作。我将尝试您的方法。我的数据存储为feather二进制文件(在我使用csv简化我的用例的示例中),makegeom函数由GIL绑定。你应该阅读以了解如何为你的情况选择一个好的计划程序。我仍在处理我的问题。我更改了
makegeom
函数,将
apply
替换为自定义
numpy
代码(速度更快)。现在我正在做一件事。我的计划是首先学习一些关于队列和进程间“共享对象”的知识,然后了解如何将dask与distribute一起使用。