在我过世之前尝试用dataframe.to_hdf加载hdf5表

时间:2019-05-31 00:29:28

标签: pandas hdf5 pytables

听起来好像真的很容易用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”得到的这堆垃圾到底是什么?如果我需要带有可查询列的表,对任何事情都有好处吗?对所有东西都有好处吗?

1 个答案:

答案 0 :(得分:0)

这是使用pytables从CSV数据创建HDF5文件的方式。您还可以使用类似的过程使用h5py创建HDF5文件。

  1. 使用循环将带有np.genfromtxt的CSV文件读入np数组。
  2. 读取第一个CSV文件后,使用.create_table()方法写入数据,并引用在步骤1中创建的np数组。
  3. 对于其他CSV文件,请使用.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()