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

lst*_*yls 10 python csv hdf5 pandas

我正在使用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)
Run Code Online (Sandbox Code Playgroud)

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

feature_column = pandas.read_csv('data.csv', usecols=[1])
hdf_file.append('features', feature_column)
Run Code Online (Sandbox Code Playgroud)

堆栈跟踪和错误消息:

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
Run Code Online (Sandbox Code Playgroud)

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

Jef*_*eff 23

完整的文档是在这里,有的菜谱策略在这里

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()
Run Code Online (Sandbox Code Playgroud)

你必须要小心谨慎,因为当读取chunk-by-chunk以获得不同的dtypes时,所得到的frrame的dtypes是可能的,例如你有一个像列一样的整数,除了说第二个块之外没有缺失值.第一个块将该列作为一个int64,而第二个块作为float64.您可能需要使用dtype关键字to强制dtypes read_csv,请参阅此处.

这里也是一个类似的问题.

  • 它自动冲洗,没有必要 (2认同)