如何将 Pandas DataFrame 存储为 HDF5 PyTables 表(或 CArray、EArray 等)?

Posted

技术标签:

【中文标题】如何将 Pandas DataFrame 存储为 HDF5 PyTables 表(或 CArray、EArray 等)?【英文标题】:How does one store a Pandas DataFrame as an HDF5 PyTables table (or CArray, EArray, etc.)? 【发布时间】:2016-11-22 11:30:02 【问题描述】:

我有以下熊猫数据框:

import pandas as pd
df = pd.read_csv(filename.csv)

现在,我可以使用 HDFStoredf 对象写入文件(就像将键值对添加到 Python 字典中):

store = HDFStore('store.h5')
store['df'] = df

http://pandas.pydata.org/pandas-docs/stable/io.html

当我查看内容时,这个对象是frame

store 

输出

<class 'pandas.io.pytables.HDFStore'>
File path: store.h5
/df            frame        (shape->[552,23252])

但是,为了使用索引,应该将其存储为table 对象。

我的方法是尝试HDFStore.put(),即

HDFStore.put(key="store.h", value=df, format=Table)

但是,这会失败并出现错误:

TypeError: put() missing 1 required positional argument: 'self'

如何将 Pandas Dataframes 保存为 PyTables 表?

【问题讨论】:

【参考方案1】:

如何将 Pandas Dataframes 保存为 PyTables 表?

除了已接受的答案之外,您应该始终关闭 PyTable 文件。为方便起见,Pandas 提供 HDFStore 作为上下文管理器:

with pd.HDFStore('/path/to/data.hdf') as hdf:
   hdf.put(key="store.h", value=df, format='table', data_columns=True)

【讨论】:

【参考方案2】:

通用部分 - 创建或打开现有的 HDFStore 文件:

store = pd.HDFStore('store.h5')

如果您想为所有列编入索引,试试这个:

store.append('key_name', df, data_columns=True)

或者,如果您只想为列的子集编制索引:

store.append('key_name', df, data_columns=['colA','colC','colN'])

PS HDFStore.append() 默认以table 格式保存DF

【讨论】:

谢谢。您如何将其存储为 CArray 或 EArray? @JianguoHisiang,我没有使用 CArray / EArray 的经验,所以我无法在评论中回答您的问题。但是 HDFStore 有什么问题呢?我的回答有帮助吗? 没错,是的。但是,我不确定如何查询这个“frame_table”对象(它不是一个“表”对象)。通常,如果 col1 被编入索引,您会尝试类似 result = [row for row in table.where('col1 &gt; 100 &amp; col1 &lt; 200')] @JianguoHisiang,你可以这样做:df = store.select(..., where='...')df = pd.read_hdf(..., where='...') 这是否与对 PyTables 表使用压缩一样有效? pytables.org/usersguide/optimization.html 我正在尝试使用 800 GB 大小的 frame_table 进行这些查询,因此它需要尽可能高效。导入这些数据的唯一方法是使用 pandas 数据框,所以我感觉有点失落。

以上是关于如何将 Pandas DataFrame 存储为 HDF5 PyTables 表(或 CArray、EArray 等)?的主要内容,如果未能解决你的问题,请参考以下文章

如何将Pandas DataFrame转换为类似字节的对象

如何使用 pymysql 将 mySQL 查询结果存储到 pandas DataFrame 中?

如何将 Pandas Dataframe 中的字符串转换为列表或字符数组?

将 Pandas dataframe.groupby 结果写入 S3 存储桶

如何将 sql 查询转换为 Pandas Dataframe 和 PySpark Dataframe

如何以“pickle”以外的 PANDAS-LOADABLE 二进制格式存储“pandas.DataFrame”