如何将 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)
现在,我可以使用 HDFStore
将 df
对象写入文件(就像将键值对添加到 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 > 100 & col1 < 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 等)?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 pymysql 将 mySQL 查询结果存储到 pandas DataFrame 中?
如何将 Pandas Dataframe 中的字符串转换为列表或字符数组?
将 Pandas dataframe.groupby 结果写入 S3 存储桶