Clasificar Pandas DataFrame dentro del grupo

Salman Mehmood 15 febrero 2024
Clasificar Pandas DataFrame dentro del grupo

Este artículo discutirá cómo clasificar los datos en orden ascendente y descendente. También aprenderemos cómo clasificar un grupo de datos con la ayuda de la función groupby() en Pandas.

Utilice la función rank() para clasificar Pandas DataFrame en Python

La clasificación es un procedimiento común cada vez que manipulamos datos o tratamos de averiguar si, por ejemplo, la ganancia es alta o baja en función de alguna clasificación. Incluso a veces, la gestión del tiempo está interesada en saber cuáles son los 10 mejores productos o los 10 últimos productos.

En Pandas, la clasificación de datos es una operación en la que queremos que los elementos de la serie se clasifiquen u ordenen según sus valores. La operación rank está inspirada en SQL ROW_NUMBER, o la mayoría de los resultados que podemos esperar de la operación ROW_NUMBER se pueden esperar de la operación rank en Pandas.

Comencemos escribiendo un código para ver un ejemplo.

Hemos cargado un conjunto de datos de una supertienda y extraído el mes y el año de los datos. Y hemos creado la tabla dinámica para el valor de las ventas durante el mes y el año.

import numpy as np
import pandas as pd
import datetime

Store_Data = pd.read_excel("demo_Data.xls")
Store_Data["OrderDateMonth"] = Store_Data["Order Date"].apply(lambda x: x.month)
Store_Data["OrderDateYear"] = Store_Data["Order Date"].apply(lambda x: x.year)

Mon_Year_Sales = pd.pivot_table(
    Store_Data,
    index=["OrderDateMonth"],
    columns=["OrderDateYear"],
    aggfunc="sum",
    values="Sales",
)
Mon_Year_Sales

Entonces, si miramos nuestra tabla dinámica, esto es lo que parece:

Tabla dinámica de pandas

Clasifique el DataFrame en orden ascendente y descendente

Ahora, tenemos que clasificar estos datos en función de los valores. La biblioteca de Pandas tiene una función rank() que opcionalmente toma el parámetro ascending y, por defecto, ordenará los datos en orden ascendente.

La función rank() tiene algunos argumentos que podemos ver presionando shift+tab+tab. Nos mostrará todos los argumentos y definiciones.

Argumentos de la función de rango de pandas

Si seguimos adelante y aplicamos la clasificación en Mon_Year_Sales y lo ejecutamos, tomará todas estas columnas y las convertirá en numéricas, cualquiera que sea la forma numérica, y hará la clasificación en orden ascendente.

Mon_Year_Sales.rank()

Pandas Rank Ventas Mes y Año - Orden Ascendente

El rango se calcula usando los valores dados.

En la segunda fila de 2014, este dato es el primer rango. Está ordenado en orden ascendente porque no le hemos pasado ningún valor al argumento ascendente.

Si le pasamos el argumento ascendente False, reordenaría la secuencia en el orden descendente de los valores.

Mon_Year_Sales.rank(ascending=False)

Ahora, el noveno mes tiene el mayor valor de ventas en 2014, por lo que ocupa el primer lugar.

Pandas Rank Ventas Mes y Año - Orden Descendente

Utilice el método groupby() para clasificar datos en función de un grupo en Pandas

Hay ciertos requisitos en los que queremos clasificar los datos en función de un grupo de valores, no del total. Supongamos que nuestros datos se ven así:

Datos de clasificación de pandas basados en un grupo

Supongamos que queremos clasificar entre las categorías por el valor Beneficio en lugar de la clasificación general.

Group_Data = (
    Store_Data.groupby(["OrderDateYear", "Category"])
    .agg({"Profit": "sum"})
    .reset_index()
)
Group_Data

Datos de clasificación de pandas basados en un grupo - Salida 1

Para el año en particular, queremos clasificar el beneficio de las categorías, por lo que, para 2014, queremos que el segundo valor sea el primero porque este es el máximo dentro de 2014.

De manera similar, para 2015 queremos una clasificación separada, como comenzar de nuevo desde 1, 2 y 3 en lugar de continuar en la general. Y luego, queremos saber qué categoría tiene el rango más alto, entonces, ¿cómo podemos lograrlo?

Para lograr el objetivo, agruparemos por año y luego seleccionaremos el “beneficio”, luego estableceremos el argumento “ascendente” para que sea “False”, lo que significa que queremos que el rango superior tenga el valor máximo. Luego establecemos el argumento método en denso.

Group_Data["Rank_groupby"] = Group_Data.groupby("OrderDateYear")["Profit"].rank(
    ascending=False, method="dense"
)
Group_Data

Después de la ejecución, ahora podemos ver que Suministros de oficina obtuvo el primer rango, y luego el otro nivel de grupo comenzó nuevamente desde 1, 2 y 3 para cada año en particular.

Datos de clasificación de pandas basados en un grupo - Salida 2

Código de ejemplo completo:

# In[1]:
import numpy as np
import pandas as pd
import datetime

Store_Data = pd.read_excel("demo_Data.xls")
Store_Data["OrderDateMonth"] = Store_Data["Order Date"].apply(lambda x: x.month)
Store_Data["OrderDateYear"] = Store_Data["Order Date"].apply(lambda x: x.year)

Mon_Year_Sales = pd.pivot_table(
    Store_Data,
    index=["OrderDateMonth"],
    columns=["OrderDateYear"],
    aggfunc="sum",
    values="Sales",
)
Mon_Year_Sales

# In[2]:

Mon_Year_Sales.rank()

# In[3]:

Mon_Year_Sales.rank(ascending=False)

# In[4]:

Store_Data.head(2)

# In[5]:

Group_Data = (
    Store_Data.groupby(["OrderDateYear", "Category"])
    .agg({"Profit": "sum"})
    .reset_index()
)
Group_Data

# In[6]:

Group_Data["Rank_groupby"] = Group_Data.groupby("OrderDateYear")["Profit"].rank(
    ascending=False, method="dense"
)
Group_Data

Lea más respuestas relacionadas de aquí.

Salman Mehmood avatar Salman Mehmood avatar

Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.

LinkedIn

Artículo relacionado - Pandas DataFrame