【发布时间】: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。
那么我该如何解决这个问题呢?
提前非常感谢!
【问题讨论】: