Agregación compleja en Pandas con MultiIndex / Sudo Null IT News

¡Hola Habr!

Hoy hablaremos de Pandas MultiIndex, una herramienta poderosa que me salvó cuando tuve que agregar un montón de datos multidimensionales. En informes que abarcan varios años con millones de filas, lo habitual groupby() Simplemente no pude arreglármelas, pero MultiIndex hizo todo de manera hermosa y rápida. Averigüemos cómo usarlo para operaciones complejas sin perder tiempo extra.

Trabajar con índice múltiple

Crear un índice múltiple

Crear un MultiIndex en Pandas es más fácil de lo que parece. Hay varias formas y dependen de los datos con los que esté trabajando. Por ejemplo, es posible que tenga un DataFrame con varias columnas que deberían representar lógicamente índices anidados. En este caso, el método ayudará. set_index():

import pandas as pd

# пример данных с несколькими уровнями
data = {
    'country': ('USA', 'USA', 'Canada', 'Canada'),
    'city': ('New York', 'Los Angeles', 'Toronto', 'Vancouver'),
    'year': (2020, 2020, 2020, 2020),
    'population': (8.4, 4.0, 2.9, 2.5)
}

df = pd.DataFrame(data)

# Создание MultiIndex
df_multi = df.set_index(('country', 'city'))
print(df_multi)

El resultado será un DataFrame con un índice de dos niveles. country y city. Ahora puede realizar operaciones en estos niveles, como en los índices normales, pero con capacidades adicionales.

Gestión de niveles de índice

Bien, creamos MultiIndex. Pero, ¿qué pasa si necesitas agregar un nuevo nivel o cambiar los existentes? Pandas proporciona varias herramientas para ello.

Agregar un nivel de índice: método set_index() También se puede utilizar para agregar índices encima de los existentes.

# Добавление индекса 'year' как еще одного уровня
df_multi = df_multi.set_index('year', append=True)
print(df_multi)

Reordenar niveles: para esto utilizamos el método swaplevel(). Por ejemplo, si necesitas intercambiar país y ciudad:

df_reordered = df_multi.swaplevel('country', 'city')
print(df_reordered)

Eliminación de niveles de índice: Esto se hace usando el método reset_index()cual “se reinicia” uno o más niveles de índice nuevamente en las columnas.

df_reset = df_multi.reset_index('city')
print(df_reset)

stack() y desastack(): trabajar con datos anidados

Métodos stack() y unstack() le permite convertir niveles de índice en columnas y viceversa:

df_stacked = df_multi.stack()
print(df_stacked)
df_unstacked = df_multi.unstack()
print(df_unstacked)

Agregación de datos con MultiIndex

Ahora pasemos a lo más importante: cómo MultiIndex ayuda a realizar agregaciones de datos complejas. Se pueden implementar agrupaciones y agregaciones multidimensionales complejas basadas en groupby() y agg(). Digamos que tenemos un DataFrame con datos por año y mes, y queremos agregar los datos en varios niveles a la vez.

Ejemplo de agrupación por varios niveles:

# Допустим, у нас есть данные о продажах за несколько лет по странам и городам
data = {
    'country': ('USA', 'USA', 'Canada', 'Canada'),
    'city': ('New York', 'Los Angeles', 'Toronto', 'Vancouver'),
    'year': (2020, 2020, 2020, 2021),
    'sales': (100, 200, 150, 130)
}

df = pd.DataFrame(data)
df_multi = df.set_index(('country', 'city', 'year'))

# Группируем по странам и считаем общие продажи
df_grouped = df_multi.groupby(level="country").sum()
print(df_grouped)

Este código nos mostrará las ventas totales por país de todos los años. Pero puedes ir aún más lejos y agregar datos en niveles dentro de niveles. Por ejemplo, usando agg()puedes combinar diferentes tipos de agregación:

df_aggregated = df_multi.groupby(level="country").agg({'sales': ('sum', 'mean')})
print(df_aggregated)

Aquí calculamos tanto el importe como la media de ventas de cada nivel.

Trabajar con sectores de datos por niveles MultiIndex

Cuando hay un MultiIndex, métodos estándar para acceder a datos del tipo .loc() volverse aún más poderoso. Por ejemplo, puede recuperar datos de un solo nivel o de una combinación de niveles.

# Доступ к данным для определенного города
print(df_multi.loc(('USA', 'New York')))
# Получение данных по конкретному году
print(df_multi.xs(2020, level="year"))

Otras funciones útiles

No paramos. A continuación se muestran algunas funciones útiles que pueden resultar útiles al trabajar con MultiIndex:

  1. Comprobando la presencia de MultiIndex: A veces es necesario comprobar rápidamente si hay un MultiIndex en el DataFrame.

print(df_multi.index.is_multi)
  1. Obtener nombres de niveles:

print(df_multi.index.names)
  1. Desempaquete los niveles de índice en columnas para facilitar las cosas:

df_flat = df_multi.reset_index()
print(df_flat)
  1. Combinando múltiples índices en un nivel: cuando necesite combinar varios índices en uno, puede utilizar pd.MultiIndex.from_tuples().

new_index = pd.MultiIndex.from_tuples((('USA', 2020), ('Canada', 2021)), names=('country', 'year'))

Así es como Pandas MultiIndex convierte datos multidimensionales complejos en estructuras fácilmente manejables, donde la agregación y la manipulación de niveles se realizan en un par de líneas. Si sus datos son más complejos que las tablas normales, MultiIndex es su mejor amigo.

Puede dominar poderosas habilidades de análisis de datos: análisis de requisitos + estadísticas + BI y obtener una profesión solicitada en el curso de Analista de Datos.

Publicaciones Similares

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *