single multiindex index groupby python pandas multi-index

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 con 1 con datos -0.732470 -0.313871 .
  • one con 2 con datos -0.031109 -2.068794 .
  • one con 3 con datos 1.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?