python - past - pandas xs
Ptableta Pandas: cómo especificar min_itemsize de los elementos de un MultiIndex (1)
Estoy almacenando un marco de datos de pandas como una tabla que contiene un MultiIndex.
El primer nivel del MultiIndex es una cadena correspondiente a un ID de usuario. Ahora, la mayoría de los ID de usuario tienen 13 caracteres, pero algunos tienen 15 caracteres. Cuando anexo un registro que contiene el ID de usuario largo, las tablas generan un error porque está esperando un campo de 13 caracteres.
ValueError(''Trying to store a string with len [15] in [user] column but/nthis column has a limit of [13]!/nConsider using min_itemsize to preset the sizes on these columns'',)
Sin embargo, no sé cómo configurar el atributo min_itemsize para los elementos de un MultiIndex. He intentado {''index'': 15}
y no funciona ...
Sé que podría obligar a todas las ID a tener 15 caracteres desde el principio al agregar espacios, pero preferiría evitar esto si fuera posible.
¡Gracias por tu ayuda!
min_itemsize
especificar el nombre del nivel de múltiples índices para el que desea establecer un min_itemsize
. Aquí hay un ejemplo:
Crea 2 marcos multi-indexados
In [1]: df1 = DataFrame(np.random.randn(4,2),index=MultiIndex.from_product([[''abcdefghijklm'',''foo''],[1,2]],names=[''string'',''number'']))
In [2]: df2 = DataFrame(np.random.randn(4,2),index=MultiIndex.from_product([[''abcdefghijklmop'',''foo''],[1,2]],names=[''string'',''number'']))
In [3]: df1
Out[3]:
0 1
string number
abcdefghijklm 1 0.737976 0.840718
2 0.605763 1.797398
foo 1 1.589278 0.104186
2 0.029387 1.417195
[4 rows x 2 columns]
In [4]: df2
Out[4]:
0 1
string number
abcdefghijklmop 1 0.539507 -1.059085
2 1.263722 -1.773187
foo 1 1.625073 0.078650
2 -0.030827 -1.691805
[4 rows x 2 columns]
Crea una tienda
In [9]: store = pd.HDFStore(''test.h5'',mode=''w'')
In [10]: store.append(''df1'',df1)
Aquí está la longitud se calcula
In [12]: store.get_storer(''df1'').table
Out[12]:
/df1/table (Table(4,)) ''''
description := {
"index": Int64Col(shape=(), dflt=0, pos=0),
"values_block_0": Float64Col(shape=(2,), dflt=0.0, pos=1),
"number": Int64Col(shape=(), dflt=0, pos=2),
"string": StringCol(itemsize=13, shape=(), dflt='''', pos=3)}
byteorder := ''little''
chunkshape := (1456,)
autoindex := True
colindexes := {
"index": Index(6, medium, shuffle, zlib(1)).is_csi=False,
"number": Index(6, medium, shuffle, zlib(1)).is_csi=False,
"string": Index(6, medium, shuffle, zlib(1)).is_csi=False}
Aquí está el error que está recibiendo ahora
In [13]: store.append(''df1'',df2)
ValueError: Trying to store a string with len [15] in [string] column but
this column has a limit of [13]!
Consider using min_itemsize to preset the sizes on these columns
Especifique min_itemsize
con el nombre del nivel
In [14]: store.append(''df'',df1,min_itemsize={ ''string'' : 15 })
In [15]: store.get_storer(''df'').table
Out[15]:
/df/table (Table(4,)) ''''
description := {
"index": Int64Col(shape=(), dflt=0, pos=0),
"values_block_0": Float64Col(shape=(2,), dflt=0.0, pos=1),
"number": Int64Col(shape=(), dflt=0, pos=2),
"string": StringCol(itemsize=15, shape=(), dflt='''', pos=3)}
byteorder := ''little''
chunkshape := (1394,)
autoindex := True
colindexes := {
"index": Index(6, medium, shuffle, zlib(1)).is_csi=False,
"number": Index(6, medium, shuffle, zlib(1)).is_csi=False,
"string": Index(6, medium, shuffle, zlib(1)).is_csi=False}
Adjuntar
In [16]: store.append(''df'',df2)
In [19]: store.df
Out[19]:
0 1
string number
abcdefghijklm 1 0.737976 0.840718
2 0.605763 1.797398
foo 1 1.589278 0.104186
2 0.029387 1.417195
abcdefghijklmop 1 0.539507 -1.059085
2 1.263722 -1.773187
foo 1 1.625073 0.078650
2 -0.030827 -1.691805
[8 rows x 2 columns]
In [20]: store.close()