English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

GroupBy en Pandas

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})

Recorrer los grupos

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.

Seleccionar el grupo p

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

Cuerpo

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

Aplicación de múltiples funciones de agregación

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

conversión

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

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