Pandas dask加载具有不同列选择的多个拼花文件

Pandas dask加载具有不同列选择的多个拼花文件,pandas,dask,parquet,dask-distributed,Pandas,Dask,Parquet,Dask Distributed,我想使用Dask从存储在不同目录中的许多拼花文件中加载特定列,每个拼花需要加载不同的列。我想使用Dask,这样我就可以在一台机器上使用多个内核。我知道如何将文件列表或通配符传递给dd.read\u parquet,以指示多个文件(例如*.parquet),但我看不到传递每个文件要读取的不同列集的方法。我想知道这是否可以使用dask.delayed来完成 我的具体情况是: 我将大型单细胞基因表达数据集(~30000行/基因×10000列/细胞)作为拼花文件存储在不同的目录中。每个目录有两个拼花文件

我想使用Dask从存储在不同目录中的许多拼花文件中加载特定列,每个拼花需要加载不同的列。我想使用Dask,这样我就可以在一台机器上使用多个内核。我知道如何将文件列表或通配符传递给
dd.read\u parquet
,以指示多个文件(例如
*.parquet
),但我看不到传递每个文件要读取的不同列集的方法。我想知道这是否可以使用
dask.delayed
来完成

我的具体情况是:

我将大型单细胞基因表达数据集(~30000行/基因×10000列/细胞)作为拼花文件存储在不同的目录中。每个目录有两个拼花文件1)大基因表达数据(单元格作为列)和2)单元格元数据(单元格作为行和单元格元数据作为列)。我使用较小的元数据拼花文件在较大的文件中查找所需的列/单元格。例如,我将使用元数据拼花文件查找特定单元类型的所有单元,然后仅从较大的文件加载这些单元。我可以使用Pandas来实现这一点,但我想使用Dask来实现并行性

如果可以使用while(参见最后一个代码示例)执行此操作,那么一种可能的方法是通过替换

pd.read_parquet(..., columns=[list_of_cols])

正如你所建议的那样

编辑

我必须对成对的
.csv
文件的单个目录执行类似的操作-元数据和相应的光谱。我的过滤逻辑是最小的,所以我创建了一个Python dict,它的键是元数据逻辑(生成文件名),值是列列表。我把字典的键值循环了一遍

  • 使用
    dd.read\u csv(…,columns=[list\u of\u cols])从相关频谱文件中读取相应的列列表。
  • ddf
    附加到一个空白列表中(后面显然是
    dd.concat()
    以在循环后将它们垂直连接在一起)

然而,在我的例子中,元数据内容以一种可预测的方式更改,这就是为什么我可以使用编程方式组装dict。

如果read\u parquet不适合内存,该怎么办?请尝试在加载文件时过滤数据
pd.read\u parquet()
接受一个
过滤器
参数。也许这可以用来减少数据的大小,使其适合内存?看一个例子。曾经在那里:它在某些地方有帮助,但dask仍然是我唯一感兴趣的地方,如果产生的数据帧太大,无法放入内存。我想我造成了一些消耗-在我之前的评论中,我假设使用了
pd.read\u parquet
。如果您的数据适合内存,则可以读取拼花地板。抱歉造成混乱。谢谢@edesz。我认为这是一条路要走!只是警告一句:目前正在做这样的事情,但如果你的资料来源是由几千个拼花文件组成,那就不容易了。清洁和重新划分确实是这里有趣的部分。目前,我们的工作流程大约为此生成了100万个任务,这真的很烦人,也让调度程序很烦恼。通过使用建筑物的read_拼花地板,荷载-清洁分析图本身变得更大。有趣的是,这种方法也会达到极限。
dask.delayed(pd.read_parquet)(..., columns=[list_of_cols])