我有一个庞大的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数据类型的任何列上,我不知道如何更改/设置它。我可以将它保存为固定格式,但我真的很想使用表来节省加载时间等问题。我已经看到了一些类似的问题,但是没有关于从字典列表中创建数据框的问题,这可能会导致问题?
感谢您的任何建议
答案 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()
然后,您可以使用相同的语法读取数据库,并通过根变量访问数据。