最近,我开始尝试使用HDF5格式来存储大熊猫的数据,但是遇到了一个无法找到解决办法的问题。在我处理CSV文件之前,我在添加新数据方面没有任何问题。
这就是我所尝试的:
store = pd.HDFStore('cdw.h5')
frame.to_hdf('cdw.h5','cdw/data_cleaned', format='table',append=True, data_columns=True,dropna=False)它抛出:
ValueError: invalid combinate of [values_axes] on appending data [name->Ordereingangsdatum,cname->Ordereingangsdatum,dtype->float64,kind->float,shape->(1, 176345)] vs current table [name->Ordereingangsdatum,cname->Ordereingangsdatum,dtype->bytes128,kind->string,shape->None]我知道它告诉我我想为某一列附加不同的数据类型,但让我感到震惊的是,我以前用其他一些CSV文件从Dataframe到那个HDF5文件编写了相同的CSV文件。
我正在对转发行业进行分析,那里的数据非常不一致--在列或其他“数据污点”中,往往会有缺失的值或混合的dtype。
我正在寻找一种将数据添加到HDF5文件中的方法,而不管列内是什么,只要列名是相同的。
在HDF存储中强制附加数据,不依赖数据类型,或者为我的问题提供其他简单的解决方案,这将是非常美妙的。目标是在以后的分析中实现自动化,因此id不喜欢每次在我拥有的62列中的一个列中有一个缺失的值时更改数据类型。
我问题的另一个问题是:
我对read_hdf的文件访问比我的read_csv消耗更多的时间--我有大约150万行,有62列。是因为我没有SSD驱动器吗?因为我已经读到read_hdf的文件访问应该更快。
我问自己是应该坚持使用CSV文件还是使用HDF5?
我们将非常感谢您的帮助。
发布于 2017-06-13 08:53:13
对于任何在附加数据时遇到相同问题的人,如果dtype并不总是被保护为相同的,那么我终于找到了一个解决方案。首先使用li = list(frame) frame[li] = frame[li].astype(object) frame.info()将每个列转换为对象,然后尝试df.to_hdf(key,value, append=True)方法并等待其错误消息。错误消息TypeError: Cannot serialize the column [not_one_datatype] because its data contents are [mixed] object dtype会告诉它仍然不喜欢的列。把那些列转换成浮子对我有用!在此之后,使用df['not_one_datatype'].astype(float)转换上述列的错误,如果您确信此列中永远不会出现浮点,则仅使用integer,否则追加方法将再次出错。
我决定与CSV和HDF5文件并行工作。如果我在HDF5上遇到问题,因为我没有解决办法,我会简单地改为CSV -这是我个人可以推荐的。
Update:好的,当考虑HDF时,这种格式的创建者似乎没有考虑到实际情况:如果某个列碰巧比对HDF文件的初始写时间长,那么当试图将数据追加到已经存在的文件时,就会发生HDF5 min_itemsize error: ValueError: Trying to store a string with len [##] in [y] column but this column has a limit of [##]!。
这里的笑话是,这个API的创建者希望我在第一次写时知道列中每一个可能的数据的最大列长度?真的?另一个不一致的地方是df.to_hdf(append=True)没有参数min_itemsize={'column1':1000}。这种格式充其量只适合于存储自创建的数据,但对于每个列中的dtype和条目的长度不设为标准的数据,则绝对不适用。当您想要独立于HDF5中顽固的Python附加来自熊猫数据的数据时,唯一的解决方案是在每个数据文件中插入数据,然后再添加一个包含非常长字符串的行(除了数字列)。只是为了确保您将始终能够追加数据,无论它将有多长时间。
当这样做时,写入过程将花费很长的时间,并消耗巨大的磁盘驱动器来保存巨大的HDF5文件。
CSV在性能、集成,特别是可用性方面肯定会战胜。
https://stackoverflow.com/questions/44432236
复制相似问题