【发布时间】:2018-02-26 13:20:05
【问题描述】:
已回答:看来此数据类型不适合添加 任意字符串到 hdf5store。
背景
我使用一个脚本来生成单行结果,并以迭代的方式将它们附加到磁盘上的文件中。为了加快速度,我决定使用 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')
这会导致以下异常
ValueError: 附加数据时 [values_axes] 的无效组合 [name->Dummy_Data,cname->Dummy_Data,dtype->int8,kind->integer,shape->(1,)] 与当前表 [name->Dummy_Data,cname->Dummy_Data,dtype->int32,kind->integer,shape->None]
我的修复尝试
我尝试调整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?
【问题讨论】:
-
请参阅stackoverflow.com/a/37054761/4893407 了解有关熊猫 HDF 中分类的 cmets。
标签: python pandas categories hdf5