如何将多个pandas数据帧合并到一个大于内存的dask数据帧中?
我正在解析制表符分隔的数据以创建表格数据,我希望将其存储在HDF5中 我的问题是我必须将数据聚合成一种格式,然后转储到HDF5中。这是~1 TB大小的数据,因此我自然无法将其放入RAM中。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.
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()
,你提供的解决方案将有效。如果我有一包数据帧呢?