将pandas数据帧从dicts列表保存为hdf5表

时间:2016-05-31 18:09:09

标签: database pandas dataframe pytables zodb

我有一个庞大的pandas数据框,我从一个字典列表中创建,其中列名是dict键。列包含不同类型的数据,但数据类型在任何给定列中都是一致的。

示例:我的一个列包含28x28个numpy数组,另一个包含字符串......等。我希望将其保存为HDF5文件,具有表格格式,以便稍后在阅读时查询数据(这些文件大约为1-2 GB)。

这就是我试图保存hdf5文件的方式:

df = pd.DataFrame(list_of_dicts)

df.convert_objects(convert_numeric=True) (**have also tried pd.to_numeric)**

df.to_hdf(path_to_save, 'df', format='table')

我收到以下错误:

  

TypeError:无法序列化[image_dims]列,因为   其数据内容为[mixed] object dtype

在这种情况下,image_dims列对于每个条目都有一个numpy数组,这发生在pandas中具有object数据类型的任何列上,我不知道如何更改/设置它。我可以将它保存为固定格式,但我真的很想使用表来节省加载时间等问题。我已经看到了一些类似的问题,但是没有关于从字典列表中创建数据框的问题,这可能会导致问题?

感谢您的任何建议

2 个答案:

答案 0 :(得分:0)

您更改了内存中的DF - df.convert_objects(convert_numeric=True) - 将返回已转换DF的副本,但不会更改原始DF。这样做是这样的:

df.apply(pd.to_numeric, errors='coerce').to_hdf(path_to_save, 'df', format='table')

df = df.apply(pd.to_numeric)
df['image_dims'] = df['image_dims'].astype(str) # in case it can't be converted to numeric
df.to_hdf(path_to_save, 'df', format='table')

PS您可能希望在调用errors='coerce'函数时使用errors='ignore'pd.to_numeric(...)参数,具体取决于您的需求

答案 1 :(得分:0)

在尝试了很多东西之后,我终于找到了一个很好的解决方案来保存混合数据类型对象,以便可以快速加载和查询它们。我以为我会发布它以防其他人遇到这个问题:

尝试失败:Pandas数据框保存为hdf5或json文件。当数据类型混合时,Hdf5只能以固定格式(无查询功能)工作。 Json使用混合,但加载此大小的文件并不快。尝试将所有numpy数组,列表等转换为字节字符串以进行保存:这比使用我正在处理的列数和不同数据类型值得更麻烦。

解决方案:使用ZODB(https://pypi.python.org/pypi/ZODB)。对象数据库非常容易实现,并且如果数据框是你的东西,很容易与pandas集成。

from ZODB.FileStorage import FileStorage
from ZODB.DB import DB
import transaction
storage = FileStorage('path_to_store.fs')
db = DB(storage)
connection = db.open()
root = connection.root()
# insert each column of the dataframe into the db
for col in df.columns:
    root[col] = df[col]
# commit changes to the db
transaction.commit()
# works like a dictionary with key:value pairs that correspond to column names
print root.keys()

# close db and connection
db.close()
connection.close()

然后,您可以使用相同的语法读取数据库,并通过根变量访问数据。