python - groupby - ¿Beneficios del multiindex del panda?
pandas reset index (1)
La indexación jerárquica (también conocida como indización de "niveles múltiples") se introdujo en la versión pandas 0.4.
Esto abre la puerta a algunos análisis y manipulaciones de datos bastante sofisticados, especialmente para trabajar con datos de mayor dimensión. En esencia, le permite almacenar y manipular de manera efectiva datos de gran dimensión en una estructura tabular bidimensional (DataFrame), por ejemplo.
Imagine construir un dataframe usando MultiIndex
así:
import pandas as pd
import numpy as np
np.arrays = [[''one'',''one'',''one'',''two'',''two'',''two''],[1,2,3,1,2,3]]
df = pd.DataFrame(np.random.randn(6,2),index=pd.MultiIndex.from_tuples(list(zip(*np.arrays))),columns=[''A'',''B''])
df # This is the dataframe we have generated
A B
one 1 -0.732470 -0.313871
2 -0.031109 -2.068794
3 1.520652 0.471764
two 1 -0.101713 -1.204458
2 0.958008 -0.455419
3 -0.191702 -0.915983
Este df
es simplemente una estructura de datos de dos dimensiones
df.ndim
2
Pero podemos imaginarlo, mirando la salida, como una estructura de datos tridimensional.
-
one
con1
con datos-0.732470 -0.313871
. -
one
con2
con datos-0.031109 -2.068794
. -
one
con3
con datos1.520652 0.471764
.
Aka: "efectivamente almacenar y manipular datos arbitrariamente de alta dimensión en una estructura tabular bidimensional"
Esto no es solo una "exhibición bonita". Tiene el beneficio de la recuperación fácil de datos ya que ahora tenemos un índice jerárquico.
Por ejemplo.
In [44]: df.ix["one"]
Out[44]:
A B
1 -0.732470 -0.313871
2 -0.031109 -2.068794
3 1.520652 0.471764
nos dará un nuevo marco de datos solo para el grupo de datos que pertenece a "uno".
Y podemos reducir aún más nuestra selección de datos al hacer esto:
In [45]: df.ix["one"].ix[1]
Out[45]:
A -0.732470
B -0.313871
Name: 1
Y, por supuesto, si queremos un valor específico, aquí hay un ejemplo:
In [46]: df.ix["one"].ix[1]["A"]
Out[46]: -0.73247029752040727
Entonces, si tenemos aún más índices (además de los 2 índices que se muestran en el ejemplo anterior), podemos profundizar y seleccionar el conjunto de datos que realmente nos interesa sin necesidad de groupby
.
Incluso podemos tomar una sección transversal (ya sea filas o columnas) de nuestro marco de datos ...
Por filas: -
In [47]: df.xs(''one'')
Out[47]:
A B
1 -0.732470 -0.313871
2 -0.031109 -2.068794
3 1.520652 0.471764
Por columnas: -
In [48]: df.xs(''B'', axis=1)
Out[48]:
one 1 -0.313871
2 -2.068794
3 0.471764
two 1 -1.204458
2 -0.455419
3 -0.915983
Name: B
Entonces aprendí que puedo usar DataFrame.groupby sin tener un MultiIndex para hacer submuestreo / secciones transversales.
Por otro lado, cuando tengo un MultiIndex en un DataFrame, aún necesito usar DataFrame.groupby para hacer submuestreo / secciones transversales.
Entonces, ¿para qué sirve un MultiIndex aparte de la visualización bastante útil y bonita de las jerarquías al imprimir?