【问题标题】:Which objecttype mapping to use when appending a dataframe containing arrays of arrays to a h5 file using pandas?使用 pandas 将包含数组数组的数据帧附加到 h5 文件时使用哪种对象类型映射?
【发布时间】:2019-11-30 06:59:51
【问题描述】:

我正在尝试创建一个抓取数据的数据库,在页面抓取访问之间保存(附加)数据。 该抓取的结果是一个数据框,其中某些列包含一个字符串数组。 例如 df = DataFrame({'Tags': np.unique(item_chars),etc})。 items_chars = ['Red','Metallic','Shiny',etc.],一个字符串数组。

但是,添加这些 DataFrames 会连续导致 2 个问题,我不知道我是否可以正确实现这一点。 1. 使用 df.to_hdf(),mode = 'a', key = 'some_key' 并且没有 append = True 可以工作,但是在读取 h5 文件时,只加载最后一个条目(但是文件大小在抓取过程中确实会增加)。 2. 使用 df.to_hdf(),加上 append = True 给出一个 TypeError

所以.. 做什么?

1) 我假设使用时默认附加数据帧:

df.to_hdf('db_loc', format='table', key='some_key, mode='a')

但是在使用时 df = pd.read_hdf('db_loc', format='table', key='some_key)

生成的 df 仅包含最后抓取的条目,因此即使文件大小增加,数据也明显被覆盖。我尝试使用 HDFview 查看 h5 文件,但没有显示任何内容。使用 texteditor 查看文件显示过去的条目存在。

要复制的代码 1):

import pandas as pd
import numpy as np


for i in range(1,10):
    df = pd.DataFrame([], columns=['name', 'tags'])
    df=df.append({'name':str('name_1'), 'tags':np.unique(['Shiny','Shiny','Metallic'])},ignore_index=True)
    df.to_hdf('data/test.h5',key='test')


df=pd.read_hdf('data/test.h5', key='test')

给予

[in]: df
[out]: name               tags
   0  name_1  [Metallic, Shiny]

预期输出:

[out]:
     name               tags
0  name_1  [Metallic, Shiny]
1  name_1  [Metallic, Shiny]
2  name_1  [Metallic, Shiny]
3  name_1  [Metallic, Shiny]
4  name_1  [Metallic, Shiny]
5  name_1  [Metallic, Shiny]
6  name_1  [Metallic, Shiny]
7  name_1  [Metallic, Shiny]
8  name_1  [Metallic, Shiny]

2) 假设 to_hdf 命令需要 append=True,我使用以下代码将 df 保存到 h5:

df.to_hdf('db_loc', key='some_key', format='table', mode = 'a' append=True)

由于某些列(例如名称)仅包含字符串(没有字符串数组),因此我在 df.to_hdf 之前将它们的对象设置为字符串:

df['Name']=df['Name'].map(str) df=df.convert_objects()

但是其他列包含一个数组,因此需要对这些列进行腌制,因为我在抓取后对数据库进行解包和后处理。

但是对于 2) df.to_hdf('db_loc', key='some_key', format='table', mode = 'a' append=True) df['Tags'] 列出现以下错误:

要复制的代码 2):

import pandas as pd
import numpy as np


for i in range(1,10):
    df = pd.DataFrame([], columns=['name', 'tags'])
    df=df.append({'name':str('name_1'), 'tags':np.unique(['Shiny','Shiny','Metallic'])},ignore_index=True)
    df.to_hdf('data/test.h5',key='test',append = True)

给出以下错误:

TypeError:无法序列化列 ['tags'] 因为 它的数据内容是 [mixed] object dtype。

那么我该如何解决这个问题呢?

提前非常感谢!

【问题讨论】:

    标签: python pandas hdf


    【解决方案1】:

    HDF 不以任何方式支持这一点,以表格格式存储腌制对象。 所以我会尝试使用SQL来存储数据。

    【讨论】:

      猜你喜欢
      • 2020-07-15
      • 1970-01-01
      • 1970-01-01
      • 2018-11-08
      • 1970-01-01
      • 1970-01-01
      • 2021-11-14
      • 2017-08-22
      • 2021-04-18
      相关资源
      最近更新 更多