single past multiindex may lexsort index impact groupby from drop python pandas pytables

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()