Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 将DICT列表中的数据帧另存为hdf5表_Database_Pandas_Dataframe_Pytables_Zodb - Fatal编程技术网

Database 将DICT列表中的数据帧另存为hdf5表

Database 将DICT列表中的数据帧另存为hdf5表,database,pandas,dataframe,pytables,zodb,Database,Pandas,Dataframe,Pytables,Zodb,我有一个大熊猫数据框,我从一个字典列表中创建,其中列名是dict键。列包含不同类型的数据,但数据类型在任何给定列中都是一致的 示例:我的一列包含28x28 numpy数组,另一列包含字符串…等等。我想将其保存为HDF5文件,采用表格格式,以便在以后读取数据时查询数据(这些文件约为1-2GB) 以下是我试图保存hdf5文件的方式: df = pd.DataFrame(list_of_dicts) df.convert_objects(convert_numeric=True) (**have a

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

示例:我的一列包含28x28 numpy数组,另一列包含字符串…等等。我想将其保存为HDF5文件,采用表格格式,以便在以后读取数据时查询数据(这些文件约为1-2GB)

以下是我试图保存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],因为 其数据内容为[混合]对象数据类型

在本例中,image_dims列的每个条目都有一个numpy数组,这种情况发生在pandas中有对象数据类型的任何列上,我不知道如何更改/设置它。我可以将其保存为固定格式,但我真的希望使用表来节省加载时间等查询。我还看到了一些类似的问题,但不是关于从字典列表创建数据框架的问题,这可能是问题的根源


感谢您的建议

您更改了内存中的DF-
DF。convert\u对象(convert\u numeric=True)
-将返回已转换DF的副本,但不会更改原始DF。改为这样做:

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


PS调用
pd.to\u numeric(…)
函数时,您可能需要使用
errors='compire'
errors='ignore'
参数,具体取决于您在内存中更改的DF-
DF。convert\u对象(convert\u numeric=True)
-将返回已转换DF的副本,但不会更改原始DF。改为这样做:

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


PS在调用
pd.to\u numeric(…)
函数时,您可能想使用
errors='concurve'
errors='ignore'
参数,这取决于您想要什么

在尝试了许多方法之后,我终于找到了一种似乎是保存混合数据类型对象的好方法,可以快速加载和查询它们。我想我会发布它,以防其他人对此有问题:

尝试但失败:数据帧另存为hdf5或json文件。当数据类型混合时,Hdf5只能以固定格式工作(无查询功能)。Json可以与mixed一起工作,但对于这种大小的文件,加载速度并不快。尝试将所有numpy数组、列表等转换为字节字符串以进行保存:对于我正在处理的列数和不同的数据类型来说,这是一个非常麻烦的问题

解决方案:使用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()

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

在尝试了许多方法之后,我终于找到了一种似乎是保存混合数据类型对象的好方法,这种方法可以快速加载和查询混合数据类型对象。我想我会发布它,以防其他人对此有问题:

尝试但失败:数据帧另存为hdf5或json文件。当数据类型混合时,Hdf5只能以固定格式工作(无查询功能)。Json可以与mixed一起工作,但对于这种大小的文件,加载速度并不快。尝试将所有numpy数组、列表等转换为字节字符串以进行保存:对于我正在处理的列数和不同的数据类型来说,这是一个非常麻烦的问题

解决方案:使用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()

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

感谢您的回复,我认为第一个解决方案会起作用,不过我得到了这个错误:类型error arg必须是列表、元组、1-d数组或序列。它适用于单个系列,但我需要用于整个数据帧。另外,您的意思是在单独的一行上调用convert对象会导致内存的变化吗?因为它没有就地转换列,而是复制了数据帧?@notarya,
DataFrame.convert\u objects()
-返回已转换的DF,但它不会更改原始DF,因此您需要:
DF=DF.convert\u objects(convert\u numeric=True)
谢谢。我认为现在的问题是,我的一些列有字符串条目,一些是数字条目,所以现在我遇到了这个问题:ValueError:(“无法分析字符串”,u“出现在索引轴_视图中”)我可能必须手动转换列或循环它们,并以这种方式转换为数字类型。@notarya,您可以尝试这样做:
df.apply(pd.to_numeric,errors='concurve')
,但是将字符串(不表示数字)转换为数字数据类型没有多大意义。您还可以准备一个必须转换的列列表,并将其用作过滤器。是的,我尝试过,但得到了相同的混合对象数据类型错误。如果我找不到比手动更改列更好的方法,我可能会尝试使用sqlite方法。感谢您的回复,我认为第一种解决方案会有效,但我会遇到以下错误:类型error arg必须是列表、元组、1-d数组或序列。它适用于单个系列,但我需要用于整个数据帧。另外,您的意思是在单独的一行上调用convert对象会导致内存的变化吗?因为它没有就地转换列,而是复制了数据帧?@notarya,
DataFrame.convert\u objects()
-返回已转换的DF,但它不会更改原始DF,因此您需要:
DF=DF.convert\u objects(convert\u numeric=True)
谢谢。我认为现在的问题是,我的一些列有字符串条目,一些是数字条目,所以现在我遇到了这个问题:ValueError:(“无法解析字符串”,u“出现在索引轴_视图”)我可能必须手动转换列或循环它们并转换为数字