背景
我使用一个脚本,该脚本生成单行结果,并以迭代方式将其追加到磁盘上的文件中。为了加快速度,我决定使用HDF5容器而不是.csv。 A benchmarking然后显示字符串减慢了HDF5的速度。我是told,将字符串转换为categorical
dtype时可以缓解这种情况。
问题
我无法将具有新类别的类别行附加到HDF5。另外,我不知道如何控制cat.codes
的dtypes,可以以某种方式完成AFAIK。
可重现的示例:
1-使用分类数据创建大型数据框
import pandas as pd
import numpy as np
from pandas import HDFStore, DataFrame
import random, string
dummy_data = [''.join(random.sample(string.ascii_uppercase, 5)) for i in range(100000)]
df_big = pd.DataFrame(dummy_data, columns = ['Dummy_Data'])
df_big['Dummy_Data'] = df_big['Dummy_Data'].astype('category')
2-创建一行以追加
df_small = pd.DataFrame(['New_category'], columns = ['Dummy_Data'])
df_small['Dummy_Data'] = df_small['Dummy_Data'].astype('category')
3-将(1)保存到HDF并尝试附加(2)
df_big.to_hdf('h5_file.h5', \
'symbols_dict', format = "table", data_columns = True, append = False, \
complevel = 9, complib ='blosc')
df_small.to_hdf('h5_file.h5', \
'symbols_dict', format = "table", data_columns = True, append = True, \
complevel = 9, complib ='blosc')
这将导致以下异常
我的固定尝试
我试图调整
cat.catcodes
的dtypes:df_big['Dummy_Data'] = df_big['Dummy_Data'].cat.codes.astype('int32')
df_small['Dummy_Data'] = df_small['Dummy_Data'].cat.codes.astype('int32')
当我这样做时,错误消失了,但是分类dtype也消失了:
df_test = pd.read_hdf('h5_file.h5', key='symbols_dict')
print df_mydict.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 100001 entries, 0 to 0 # The appending worked now
Data columns (total 1 columns):
Dummy_Data 100001 non-null int32 # Categorical dtype gone
dtypes: int32(1) # I need to change dtype of cat.codes of categorical
memory usage: 1.1 MB # Not of categorical itself
另外,
df_small.info()
最初没有显示cat.codes
的dtype,这使得调试变得很困难。我究竟做错了什么?问题
1.如何正确更改
cat.codes
的dtypes?2.如何在Python中将分类数据正确附加到HDF5?
最佳答案
我不是专家,但是就我至少看过h5py模块http://docs.h5py.org/en/latest/high/dataset.html而言,HDF5支持Numpy数据类型,该数据类型不包含任何分类数据类型。
Pandas 使用的PyTables也是如此。
在Pandas datatypes中引入并使用了类别数据类型,并对其进行了描述:
所以可能发生的事情是,每次为了添加新类别,您都必须以某种方式重新读取hdf5store中的所有现有类别,以使Pandas重新索引吗?
但是,从一般的文档来看,似乎该数据类型而不是适合将任意字符串添加到hdf5store中,除非您确定可能在添加几次之后不会有新类别。
另外要注意的是,除非您的应用程序要求极高的性能,否则将数据存储在SQL中可能是一个更好的选择-一方面,SQL对字符串的支持更好。例如,虽然在某些test中发现SQLite的速度比HDF5慢,但它们不包括处理字符串。从CSV跳到HDF5听起来就像从马车跳到火箭一样,但也许汽车或飞机也能工作得很好(或者说,有更多选择可以更好地延伸类比)?
关于python - 如何在 Pandas 中将新类别添加到HDF5?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46271921/