【问题标题】:Pytables table into pandas DataFrame将 Pytables 表转换为 pandas DataFrame
【发布时间】:2012-10-07 02:49:14
【问题描述】:

关于如何将 csv 读入 pandas 数据帧的大量信息,但我拥有的是一个 pyTable 表并想要一个 pandas 数据帧。

我找到了如何将我的 pandas DataFrame 存储到 pytables...然后读我想读回它,此时它将具有:

"kind = v._v_attrs.pandas_type"  

我可以将它写成 csv 并重新读入,但这似乎很愚蠢。这就是我现在正在做的事情。

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

【问题讨论】:

    标签: pandas pytables


    【解决方案1】:

    文档现在包含关于 using the HDF5 store 的精彩部分,cookbook 中讨论了一些更高级的策略。

    现在比较简单:

    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
    

    你也可以query within a table

    【讨论】:

      【解决方案2】:
      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 数组的全部 dtypes。

      【讨论】:

      • 谢谢,但这如何将非 pandas h5 文件中的数据读取到 pandas h5 文件中?看起来它只是将随机数据放入 pandas h5 文件中。我可以像这样“for rec in table:”读取我的源表,但该表不是pandas h5文件,它只是一个pytable表,因此它作为pandas源失败,因为“kind”不是“pandas_type”。
      • 等一下,我花了更多时间来处理这个......你是说我需要做的只是将带有额外数据类型信息的结构化数组添加到我现有的 pytables 表中,然后它将导入到 pandas df ?我真的只知道如何使用 pyTables ...它将数据类型信息保存在叶子对象的属性中。如果我有这个正确的熊猫如何关联到两个叶子对象。 (一个带有数据类型信息,一个带有数据表)
      • import numpy as np grades = np.empty((10,2), dtype=(('name', 'S20'), ('grade', 'u2'))) 这个必须做个bug python看不懂代码
      • 抱歉,您是对的:您必须使用列表 ([]) 对 dtype 规范进行分组,而不是元组 (())。
      • 至于您的其他问题,我无法理解您想要什么。我将原始帖子理解为“我有一个 PyTables 表,我想要一个类型正确的 Pandas DataFrame”。答案表明,_v_attrs 并没有搞砸,因为 PyTables 表加载到记录数组,其 dtype 规范被 Pa​​ndas 理解,即使后来 Pandas 只支持 8 字节整数、8 字节浮点数和对象,而不是满满的numpy dtypes
      猜你喜欢
      • 1970-01-01
      • 2017-03-17
      • 2017-03-23
      • 1970-01-01
      • 2017-04-13
      • 2021-03-29
      • 2017-04-27
      • 2017-01-28
      相关资源
      最近更新 更多