English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Ejemplo de operaciones de GroupBy de Pandas
Cualquier operación de groupby realiza las siguientes operaciones en el objeto original:
Dividir objeto Aplicar función Combinar resultados
En muchos casos, dividimos los datos en varios grupos y aplicamos algunas funciones en cada subconjunto. En la función Apply, podemos realizar las siguientes operaciones-
Agrupación − Calcular estadísticas resumen conversión − Operaciones de agrupamiento Filtrar − Filtrar datos en ciertas condiciones
Ahora creamos un objeto DataFrame y le realizamos todas las operaciones.
#importar la biblioteca pandas import pandas as pd ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings', 'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'], 'Ranking': [1 2 2 3 34 1 12 412], 'Año': [201420152014201520142015201620172016201420152017], 'Puntos': [876789863673741812756788694701804690]} df = pd.DataFrame(ipl_data) print(df)
Los resultados de la ejecución son los siguientes:
Puntos Clasificación Equipo Año 0 876 1 Riders 2014 1 789 2 Riders 2015 2 863 2 Devils 2014 3 673 3 Devils 2015 4 741 3 Kings 2014 5 812 4 kings 2015 6 756 1 Kings 2016 7 788 1 Kings 2017 8 694 2 Riders 2016 9 701 4 Royals 2014 10 804 1 Royals 2015 11 690 2 Riders 2017
象可以拆分为任何对象。有多种分割对象的方法,例如:
obj.groupby('key') obj.groupby(['key1','key2']) obj.groupby(key,axis=1)
现在我们看看如何将分组对象应用于DataFrame对象
# importar la biblioteca pandas import pandas as pd ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings', 'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'], 'Ranking': [1 2 2 3 34 1 12 412], 'Año': [201420152014201520142015201620172016201420152017], 'Puntos': [876789863673741812756788694701804690]} df = pd.DataFrame(ipl_data) print(df.groupby('Team'))
Los resultados de la ejecución son los siguientes:
# importar la biblioteca pandas import pandas as pd ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings', 'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'], 'Ranking': [1 2 2 3 34 1 12 412], 'Año': [201420152014201520142015201620172016201420152017], 'Puntos': [876789863673741812756788694701804690]} df = pd.DataFrame(ipl_data) print(df.groupby('Team').groups)
Los resultados de la ejecución son los siguientes:
{'Kings': Int64Índice([4 6 7], dtype='int64'), 'Devils': Int64Índice([2 3], dtype='int64'), 'Riders': Int64Index([0, 1 8 11], dtype='int64'), 'Royals': Int64Índice([9 10], dtype='int64'), 'kings' : Int64Índice([5], dtype='int64})
用多列分组
# importar la biblioteca pandas import pandas as pd ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings', 'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'], 'Ranking': [1 2 2 3 34 1 12 412], 'Año': [201420152014201520142015201620172016201420152017], 'Puntos': [876789863673741812756788694701804690]} df = pd.DataFrame(ipl_data) print(df.groupby(['Team','Year']).groups)
Los resultados de la ejecución son los siguientes:
{('Kings', 2014): Int64Índice([4], dtype='int64'), ('Royals', 2014): Int64Índice([9], dtype='int64'), ('Riders', 2014): Int64Index([0], dtype='int64'), ('Riders', 2015): Int64Índice([1], dtype='int64'), ('Kings', 2016): Int64Índice([6], dtype='int64'), ('Riders', 2016): Int64Índice([8], dtype='int64'), ('Riders', 2017): Int64Índice([11], dtype='int64'), ('Devils', 2014): Int64Índice([2], dtype='int64'), ('Devils', 2015): Int64Índice([3], dtype='int64'), ('kings', 2015): Int64Índice([5], dtype='int64'), ('Royals', 2015): Int64Índice([10], dtype='int64'), ('Kings', 2017): Int64Índice([7], dtype='int64})
Con el objeto groupby, podemos recorrer el objeto de manera similar a itertools.obj.
# importar la biblioteca pandas import pandas as pd ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings', 'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'], 'Ranking': [1 2 2 3 34 1 12 412], 'Año': [201420152014201520142015201620172016201420152017], 'Puntos': [876789863673741812756788694701804690]} df = pd.DataFrame(ipl_data) grouped = df.groupby('Year') for name, group in grouped: print(name) print(group)
Los resultados de la ejecución son los siguientes:
2014 Puntos Ranking Equipo Año 0 876 1 Riders 2014 2 863 2 Devils 2014 4 741 3 Kings 2014 9 701 4 Royals 2014 2015 Puntos Ranking Equipo Año 1 789 2 Riders 2015 3 673 3 Devils 2015 5 812 4 kings 2015 10 804 1 Royals 2015 2016 Puntos Ranking Equipo Año 6 756 1 Kings 2016 8 694 2 Riders 2016 2017 Puntos Clasificación Equipo Año 7 788 1 Kings 2017 11 690 2 Riders 2017
Por defecto, el nombre de la etiqueta del objeto groupby es el mismo que el nombre del grupo.
Con el método get_group() podemos seleccionar un grupo.
# importar la biblioteca pandas import pandas as pd ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings', 'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'], 'Ranking': [1 2 2 3 34 1 12 412], 'Año': [201420152014201520142015201620172016201420152017], 'Puntos': [876789863673741812756788694701804690]} df = pd.DataFrame(ipl_data) grouped = df.groupby('Year') print(grouped.get_group(2014))
Los resultados de la ejecución son los siguientes:
Puntos Clasificación Equipo Año 0 876 1 Riders 2014 2 863 2 Devils 2014 4 741 3 Kings 2014 9 701 4 Royals 2014
Las funciones de agregación devuelven un valor de agregación para cada grupo. Una vez creado el objeto de grupo, se pueden realizar varias operaciones de agregación en los datos agrupados.
Un método obvio es la agrupación por sumar o métodos equivalentes como agg().
# importar la biblioteca pandas import pandas as pd import numpy as np ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings', 'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'], 'Ranking': [1 2 2 3 34 1 12 412], 'Año': [201420152014201520142015201620172016201420152017], 'Puntos': [876789863673741812756788694701804690]} df = pd.DataFrame(ipl_data) grouped = df.groupby('Year') print(grouped['Points'].agg(np.mean))
Los resultados de la ejecución son los siguientes:
Año 2014 795.25 2015 769.50 2016 725.00 2017 739.00 Nombre: Puntos, tipo de datos: float64
Otra manera de ver el tamaño de cada grupo es mediante la aplicación de la función size().
import pandas as pd import numpy as np ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings', 'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'], 'Ranking': [1 2 2 3 34 1 12 412], 'Año': [201420152014201520142015201620172016201420152017], 'Puntos': [876789863673741812756788694701804690]} df = pd.DataFrame(ipl_data) Acceso a Atributos en Python Pandas grouped = df.groupby('Team') print(grouped.agg(np.size))
Los resultados de la ejecución son los siguientes:
Puntos Clasificación Año Equipo Devils 2 2 2 Kings 3 3 3 Riders 4 4 4 Royals 2 2 2 kings 1 1 1
Gracias al Series de agrupamiento, también se puede pasar una lista o diccionario de funciones para la agregación y generar un DataFrame como salida-
# importar la biblioteca pandas import pandas as pd import numpy as np ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings', 'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'], 'Ranking': [1 2 2 3 34 1 12 412], 'Año': [201420152014201520142015201620172016201420152017], 'Puntos': [876789863673741812756788694701804690]} df = pd.DataFrame(ipl_data) grouped = df.groupby('Team') print(grouped['Points'].agg([np.sum, np.mean, np.std]))
Los resultados de la ejecución son los siguientes:
Equipo suma media desvión Devils 1536 768.000000 134.350288 Kings 2285 761.666667 24.006943 Riders 3049 762.250000 88.567771 Royals 1505 752.500000 72.831998 kings 812 812.000000 NaN
La conversión en grupos o columnas devuelve un índice, el tamaño del cual es igual al del objeto que se está agrupando. Por lo tanto, la conversión debe devolver un resultado del mismo tamaño que el bloque de grupo.
# importar la biblioteca pandas import pandas as pd import numpy as np ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings', 'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'], 'Ranking': [1 2 2 3 34 1 12 412], 'Año': [201420152014201520142015201620172016201420152017], 'Puntos': [876789863673741812756788694701804690]} df = pd.DataFrame(ipl_data) grouped = df.groupby('Team') score = lambda x: (x - x.mean())) / x.std()*10 print(grouped.transform(score))
Los resultados de la ejecución son los siguientes:
Puntos Ranking Año 0 12.843272 -15.000000 -11.618950 1 3.020286 5.000000 -3.872983 2 7.071068 -7.071068 -7.071068 3 -7.071068 7.071068 7.071068 4 -8.608621 11.547005 -10.910895 5 NaN NaN NaN 6 -2.360428 -5.773503 2.182179 7 10.969049 -5.773503 8.728716 8 -7.705963 5.000000 3.872983 9 -7.071068 7.071068 -7.071068 10 7.071068 -7.071068 7.071068 11 -8.157595 5.000000 11.618950
Filtrar datos según condiciones definidas y devolver un subconjunto de datos. La función filter() se utiliza para filtrar datos.
import pandas as pd import numpy as np ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings', 'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'], 'Ranking': [1 2 2 3 34 1 12 412], 'Año': [201420152014201520142015201620172016201420152017], 'Puntos': [876789863673741812756788694701804690]} df = pd.DataFrame(ipl_data) print(df.groupby('Team').filter(lambda x: len(x) >= 3))
Los resultados de la ejecución son los siguientes:
Puntos Ranking Equipo Año 0 876 1 Riders 2014 1 789 2 Riders 2015 4 741 3 Kings 2014 6 756 1 Kings 2016 7 788 1 Kings 2017 8 694 2 Riders 2016 11 690 2 Riders 2017