背景

我使用一个脚本,该脚本生成单行结果,并以迭代方式将其追加到磁盘上的文件中。为了加快速度,我决定使用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/

10-12 22:56