首页 文章

在Pandas中将列添加到HDF文件的框架中

提问于
浏览
8

我正在使用CSV格式的大型数据集 . 我试图逐列处理数据,然后将数据附加到HDF文件中的帧 . 所有这些都是使用Pandas完成的 . 我的动机是,虽然整个数据集比我的物理内存大得多,但列大小是可管理的 . 在稍后阶段,我将通过逐列将列加载回内存并对其进行操作来执行特征逐步逻辑回归 .

我能够创建一个新的HDF文件并使用第一列创建一个新框架:

hdf_file = pandas.HDFStore('train_data.hdf')
feature_column = pandas.read_csv('data.csv', usecols=[0])
hdf_file.append('features', feature_column)

但在那之后,我在尝试向框架追加新列时得到一个ValueError:

feature_column = pandas.read_csv('data.csv', usecols=[1])
hdf_file.append('features', feature_column)

堆栈跟踪和错误消息:

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python2.7/dist-packages/pandas/io/pytables.py", line 658, in append self._write_to_group(key, value, table=True, append=True, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/pandas/io/pytables.py", line 923, in _write_to_group s.write(obj = value, append=append, complib=complib, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/pandas/io/pytables.py", line 2985, in write **kwargs)
File "/usr/local/lib/python2.7/dist-packages/pandas/io/pytables.py", line 2675, in create_axes raise ValueError("cannot match existing table structure for [%s] on appending data" % items)
ValueError: cannot match existing table structure for [srch_id] on appending data

我是处理大型数据集和有限内存的新手,因此我愿意接受有关使用此数据的其他方法的建议 .

1 回答

  • 23

    完整的文档是here,以及一些食谱策略here

    PyTables是面向行的,因此您只能追加行 . 读取csv chunk-by-chunk然后在你去的时候附加整个帧,如下所示:

    store = pd.HDFStore('file.h5',mode='w')
    for chunk in read_csv('file.csv',chunksize=50000):
             store.append('df',chunk)
    store.close()
    

    你必须小心谨慎,因为当读取chunk-by-chunk时,所得到的frrame的dtypes可能具有不同的dtypes,例如你有一个类似于整数的列,在第二个块之前没有缺失值 . 第一个块将该列作为 int64 ,而第二个块作为 float64 . 您可能需要使用 dtype 关键字强制dtypes为 read_csv ,请参阅here .

    here也是一个类似的问题 .

相关问题