将Pytables表格转换成pandas DataFrame

6

有很多关于如何将csv文件读入pandas dataframe的信息,但我手头有一个pyTable表格,想要转换成pandas DataFrame。

我已经找到了如何将我的pandas DataFrame存储到pytables中...现在我想要读取它,此时它应该是:

"kind = v._v_attrs.pandas_type"  

我可以把它写成csv文件再重新读入,但这似乎很愚蠢,目前就是这么做的。

我应该如何将pytable对象读入pandas?

2个回答

7
import tables as pt
import pandas as pd
import numpy as np

# the content is junk but we don't care
grades = np.empty((10,2), dtype=(('name', 'S20'), ('grade', 'u2')))

# write to a PyTables table
handle = pt.openFile('/tmp/test_pandas.h5', 'w')
handle.createTable('/', 'grades', grades)
print handle.root.grades[:].dtype # it is a structured array

# load back as a DataFrame and check types
df = pd.DataFrame.from_records(handle.root.grades[:])
df.dtypes

请注意,您的u2(无符号2字节整数)将会变成i8(8字节整数),并且字符串将被视为对象,因为Pandas尚未支持Numpy数组可用的所有dtype范围。


谢谢,但是这个程序如何从非 pandas h5 文件中读取数据到 pandas h5 文件中呢?看起来它只是将随机数据放入 pandas h5 文件中。我可以像这样读取我的源表 'for rec in table:',但该表不是 pandas h5 文件,而只是一个 pytable 表格,因此它会失败,因为“kind”不是“pandas_type”。 - Jim Knoll
等一下,我需要再花点时间研究一下...你是说我只需要在现有的pytables表中添加一个带有额外数据类型信息的结构化数组,然后它就可以导入到pandas df中了吗?我真的只知道如何使用pyTables...它将数据类型信息保存在叶对象的属性中。如果我理解正确,那么pandas如何关联这两个叶对象呢?(一个带有数据类型信息,一个带有数据表) - Jim Knoll
导入numpy库 grades = np.empty((10,2), dtype=(('name', 'S20'), ('grade', 'u2'))) 这可能是一个错误,Python无法理解这段代码。 - Jim Knoll
抱歉,你是对的:你必须使用列表([])来分组dtype规范,而不是元组(())。 - meteore
至于您的其他问题,我有些难以理解您想要什么。我理解原帖是“我有一个PyTables表格,我想要一个具有正确类型的Pandas DataFrame”。答案表明,无需对_v_attrs进行任何操作,因为PyTables表格加载到记录数组中,其dtype规范被Pandas所理解,即使后来Pandas仅支持8字节整数、8字节浮点数和对象,而不是完整的numpy dtypes财富。 - meteore
显示剩余2条评论

5

现在文档中包括一个关于使用HDF5存储的优秀部分,并且在食谱中讨论了一些更高级的策略。

现在相对来说比较简单:

In [1]: store = HDFStore('store.h5')

In [2]: print store
<class 'pandas.io.pytables.HDFStore'>
File path: store.h5
Empty

In [3]: df = DataFrame([[1, 2], [3, 4]], columns=['A', 'B'])

In [4]: store['df'] = df

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

并从HDF5/pytables检索:

In [6]: store['df']  # store.get('df') is an equivalent
Out[6]:
   A  B
0  1  2
1  3  4

您还可以在表格内查询


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接