如何在 pandas 中将新类别附加到 HDF5?
How to append new categories to HDF5 in pandas?
Answered: It appears that this datatype will not be suited for adding
arbitrary strings into hdf5store.
背景
我使用一个脚本来生成单行结果,并以迭代的方式将它们附加到磁盘上的文件中。为了加快速度,我决定使用 HDF5 容器而不是 .csv。 then revealed that strings slow HDF5 down. I was 这可以在将字符串转换为 categorical
dtype 时得到缓解。
问题
我无法将带有新类别的分类行附加到 HDF5。另外,我不知道如何控制 cat.codes
的数据类型,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: invalid combinate of [values_axes] on appending data [name->Dummy_Data,cname->Dummy_Data,dtype->int8,kind->integer,shape->(1,)]
vs current table
[name->Dummy_Data,cname->Dummy_Data,dtype->int32,kind->integer,shape->None]
我的修复尝试
我尝试调整 cat.catcodes
的数据类型:
df_big['Dummy_Data'] = df_big['Dummy_Data'].cat.codes.astype('int32')
df_small['Dummy_Data'] = df_small['Dummy_Data'].cat.codes.astype('int32')
当我这样做时,错误消失了,但分类数据类型也消失了:
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
的数据类型?
2. 如何在 python?
中正确地将分类数据附加到 HDF5
如果对你有帮助,我会重写你代码的开头。对我有用。
import pandas as pd
from pandas import HDFStore, DataFrame
import random, string
def create_dummy(nb_iteration):
dummy_data = [''.join(random.sample(string.ascii_uppercase, 5)) for i in range(nb_iteration)]
df = pd.DataFrame(dummy_data, columns = ['Dummy_Data'])
return df
df_small= create_dummy(53)
df_big= create_dummy(100000)
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')
df_test = pd.read_hdf('test_def.h5', key='table')
df_test
我不是这方面的专家,但至少我看过 h5py 模块,http://docs.h5py.org/en/latest/high/dataset.html,HDF5 支持 Numpy 数据类型,不包括任何分类数据类型。
与 PyTables 相同,由 Pandas 使用。
Categories数据类型在Pandas datatypes中被引入和使用,描述:
A categorical variable takes on a limited, and usually fixed, number of possible values (categories; levels in R)
所以可能发生的情况是,也许每次为了添加新类别,您都必须以某种方式重新读取 hdf5store 中的所有现有类别,以便 Pandas 重新索引它?
然而,从一般文档来看,该数据类型似乎不适合将任意字符串添加到 hdf5store 中,除非您确定在添加了几次之后将不会有新类别。
另外请注意,除非您的应用程序需要极高的性能,否则将数据存储在 SQL 中可能是一个更好的选择——一方面,SQL 对字符串有更好的支持。例如,虽然 SQLite 在某些 test 中被发现比 HDF5 慢,但它们不包括处理字符串。从 CSV 跳到 HDF5 听起来就像从马车跳到火箭,但也许汽车或飞机也能正常工作(或者更好,因为它有更多选项,可以延伸类比)?
Answered: It appears that this datatype will not be suited for adding arbitrary strings into hdf5store.
背景
我使用一个脚本来生成单行结果,并以迭代的方式将它们附加到磁盘上的文件中。为了加快速度,我决定使用 HDF5 容器而不是 .csv。 categorical
dtype 时得到缓解。
问题
我无法将带有新类别的分类行附加到 HDF5。另外,我不知道如何控制 cat.codes
的数据类型,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: invalid combinate of [values_axes] on appending data [name->Dummy_Data,cname->Dummy_Data,dtype->int8,kind->integer,shape->(1,)] vs current table [name->Dummy_Data,cname->Dummy_Data,dtype->int32,kind->integer,shape->None]
我的修复尝试
我尝试调整 cat.catcodes
的数据类型:
df_big['Dummy_Data'] = df_big['Dummy_Data'].cat.codes.astype('int32')
df_small['Dummy_Data'] = df_small['Dummy_Data'].cat.codes.astype('int32')
当我这样做时,错误消失了,但分类数据类型也消失了:
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
的数据类型?
2. 如何在 python?
如果对你有帮助,我会重写你代码的开头。对我有用。
import pandas as pd
from pandas import HDFStore, DataFrame
import random, string
def create_dummy(nb_iteration):
dummy_data = [''.join(random.sample(string.ascii_uppercase, 5)) for i in range(nb_iteration)]
df = pd.DataFrame(dummy_data, columns = ['Dummy_Data'])
return df
df_small= create_dummy(53)
df_big= create_dummy(100000)
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')
df_test = pd.read_hdf('test_def.h5', key='table')
df_test
我不是这方面的专家,但至少我看过 h5py 模块,http://docs.h5py.org/en/latest/high/dataset.html,HDF5 支持 Numpy 数据类型,不包括任何分类数据类型。
与 PyTables 相同,由 Pandas 使用。
Categories数据类型在Pandas datatypes中被引入和使用,描述:
A categorical variable takes on a limited, and usually fixed, number of possible values (categories; levels in R)
所以可能发生的情况是,也许每次为了添加新类别,您都必须以某种方式重新读取 hdf5store 中的所有现有类别,以便 Pandas 重新索引它?
然而,从一般文档来看,该数据类型似乎不适合将任意字符串添加到 hdf5store 中,除非您确定在添加了几次之后将不会有新类别。
另外请注意,除非您的应用程序需要极高的性能,否则将数据存储在 SQL 中可能是一个更好的选择——一方面,SQL 对字符串有更好的支持。例如,虽然 SQLite 在某些 test 中被发现比 HDF5 慢,但它们不包括处理字符串。从 CSV 跳到 HDF5 听起来就像从马车跳到火箭,但也许汽车或飞机也能正常工作(或者更好,因为它有更多选项,可以延伸类比)?