Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/pandas/4.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
如何将多个pandas数据帧合并到一个大于内存的dask数据帧中?_Pandas_Hdf5_Dask_Pytables_Bigdata - Fatal编程技术网

如何将多个pandas数据帧合并到一个大于内存的dask数据帧中?

如何将多个pandas数据帧合并到一个大于内存的dask数据帧中?,pandas,hdf5,dask,pytables,bigdata,Pandas,Hdf5,Dask,Pytables,Bigdata,我正在解析制表符分隔的数据以创建表格数据,我希望将其存储在HDF5中 我的问题是我必须将数据聚合成一种格式,然后转储到HDF5中。这是~1 TB大小的数据,因此我自然无法将其放入RAM中。Dask可能是完成此任务的最佳方式 如果我使用解析数据来适应一个数据帧,我会这样做: import pandas as pd import csv csv_columns = ["COL1", "COL2", "COL3", "COL4",..., "COL55"] readcsvfile = csv.

我正在解析制表符分隔的数据以创建表格数据,我希望将其存储在HDF5中

我的问题是我必须将数据聚合成一种格式,然后转储到HDF5中。这是~1 TB大小的数据,因此我自然无法将其放入RAM中。Dask可能是完成此任务的最佳方式

如果我使用解析数据来适应一个数据帧,我会这样做:

import pandas as pd
import csv   

csv_columns = ["COL1", "COL2", "COL3", "COL4",..., "COL55"]
readcsvfile = csv.reader(csvfile)

total_df = pd.DataFrame()    # create empty pandas DataFrame
for i, line in readcsvfile:
    # parse create dictionary of key:value pairs by table field:value, "dictionary_line"
    # save dictionary as pandas dataframe
    df = pd.DataFrame(dictionary_line, index=[i])  # one line tabular data 
    total_df = pd.concat([total_df, df])   # creates one big dataframe
使用dask执行相同的任务,用户似乎应该尝试以下操作:

import pandas as pd
import csv 
import dask.dataframe as dd
import dask.array as da

csv_columns = ["COL1", "COL2", "COL3", "COL4",..., "COL55"]   # define columns
readcsvfile = csv.reader(csvfile)       # read in file, if csv

# somehow define empty dask dataframe   total_df = dd.Dataframe()? 
for i, line in readcsvfile:
    # parse create dictionary of key:value pairs by table field:value, "dictionary_line"
    # save dictionary as pandas dataframe
    df = pd.DataFrame(dictionary_line, index=[i])  # one line tabular data 
    total_df = da.concatenate([total_df, df])   # creates one big dataframe
创建~TB数据帧后,我将保存到hdf5中

我的问题是
total_df
不适合RAM,必须保存到磁盘。
dask
dataframe能否完成此任务

我应该试试别的吗?从多个dask阵列(即每列/字段一个dask阵列)创建HDF5是否更容易?也许在几个节点之间划分数据帧,并最终减少


编辑:为了清楚起见,我实际上不是直接从csv文件中读取。我正在聚合、解析和格式化表格数据。因此,上面使用了
readcsvfile=csv.reader(csvfile)
以清晰/简洁,但它比在csv文件中读取要复杂得多

Dask.dataframe通过惰性处理大于内存的数据集。将具体数据附加到dask.dataframe将不会产生效果

如果您的数据可以由pd.read\u csv处理 功能非常灵活。您在上面说过您的解析过程非常复杂,但可能仍然值得研究
pd.read_csv
的选项,看看它是否仍然有效。
dask.dataframe.read\u csv
函数支持这些相同的参数

特别是,如果担心数据是由制表符而不是逗号分隔的,这根本不是问题。Pandas支持
sep='\t'
关键字以及几十个其他选项

考虑Dask.包

如果您想逐行操作文本文件,那么考虑使用DASK.BAG来解析数据,从一组文本开始。

import dask.bag as db
b = db.read_text('myfile.tsv', blocksize=10000000)  # break into 10MB chunks
records = b.str.split('\t').map(parse)
df = records.to_dataframe(columns=...)
写入HDF5文件 拥有dask.dataframe后,请尝试
.to_hdf
方法:

df.to_hdf('myfile.hdf5', '/df')

您是否尝试过
dd.read\u csv('filename.csv')。到\u hdf('filename.hdf5','/df')
?@MRocklin这只在直接从csv文件导入时有效(我相信)。如果您正在解析csv行或其他来源的表格数据,则此操作不起作用。您选择解析单个csv行而不是使用
dd.read\u csv
有什么原因吗?Pandas解析器比标准库
csv
module@MRocklin它不是来自csv文件。这是我正在解析为“类似csv”格式的制表符分隔数据。为了清楚起见,我简化了上面的问题。我应该编辑上面的内容——你是对的,如果使用
csv.reader()
,你提供的解决方案将有效。如果我有一包数据帧呢?