听起来好像真的很容易用Google回答,但是我发现不可能用这种方式回答我大多数的琐碎的大熊猫/小桌子问题。我要做的就是将大约6000个不同CSV文件中的30亿条记录加载到单个HDF5文件中的单个表中。它是一个简单的表,包含26个字段,由字符串,浮点数和整数组成。我正在使用df = pandas.read_csv()加载CSV,然后使用df.to_hdf()将它们附加到我的hdf5文件中。我真的不想使用df.to_hdf(data_columns = True),因为它看起来大约需要20天,而df.to_hdf(data_columns = False)大约需要4天。但是很显然,当您使用df.to_hdf(data_columns = False)时,您最终会收到一堆垃圾,甚至无法从中恢复表结构(因此,对我而言,这似乎是没有教养的)。在hdf5表中只能识别min_itemsize列表中标识的列(4个字符串列),其余的按数据类型被转储到values_block_0到values_block_4:
表= h5file.get_node('/ tbl_main / table') 打印(table.colnames) ['index','values_block_0','values_block_1','values_block_2','values_block_3','values_block_4','str_col1','str_col2','str_col3','str_col4']
任何查询,例如df = pd.DataFrame.from_records(table.read_where(condition))都会失败,并显示错误“异常:数据必须为一维”
所以我的问题是:(1)我真的需要使用5倍长的“ data_columns = True”吗?我期望快速加载,然后在加载表后仅对几列进行索引。 (2)使用“ data_columns = False”得到的这堆垃圾到底是什么?如果我需要带有可查询列的表,对任何事情都有好处吗?对所有东西都有好处吗?
答案 0 :(得分:0)
这是使用pytables从CSV数据创建HDF5文件的方式。您还可以使用类似的过程使用h5py创建HDF5文件。
np.genfromtxt
的CSV文件读入np数组。.create_table()
方法写入数据,并引用在步骤1中创建的np数组。.append()
方法(参考在步骤1中创建的np数组)写入数据循环结束
import numpy as np
import tables as tb
csv_list = ['SO_56387241_1.csv', 'SO_56387241_2.csv' ]
with tb.open_file('SO_56387241.h5', mode='w') as h5f:
for PATH_csv in csv_list:
csv_data = np.genfromtxt(PATH_csv, names=True, dtype=None, delimiter=',')
if h5f.__contains__('/CSV_Data') :
dset = h5f.root.CSV_Data
dset.append(csv_data)
else:
dset = h5f.create_table('/','CSV_Data', obj=csv_data)
dset.flush()
h5f.close()