Operaciones sobre groupby¶
Agrupar datos de un dataframe¶
import pandas as pd
# se crea el dataframe a partir de un diccionario
df = pd.DataFrame({'a':[2,2,3,3,4,4,4], 'b':[4,3,6,5,4,3,2], 'c':[7,6,5,7,3,8,6]})
print df
a b c 0 2 4 7 1 2 3 6 2 3 6 5 3 3 5 7 4 4 4 3 5 4 3 8 6 4 2 6 [7 rows x 3 columns]
Se agrupan los datos con los elementos de la columna a
group_a = df.groupby('a')
Ahora en group_a se tiene un nombre y un dataframe por cada elemento, sin repetir, de la columna a. El nombre equivale a los valores en a.
Iterar sobre un groupby¶
Los datos en group_a se encuentran como una tupla (nombre, datos), por lo que se itera sobre dos variables:
for nombre, datos in group_a:
print nombre
print datos
2 a b c 0 2 4 7 1 2 3 6 [2 rows x 3 columns] 3 a b c 2 3 6 5 3 3 5 7 [2 rows x 3 columns] 4 a b c 4 4 4 3 5 4 3 8 6 4 2 6 [3 rows x 3 columns]
Obtener datos por el nombre¶
Se sabe que los nombres de cada grupo son los valores de la columna a sin repetir: 2, 3 y 4. Se puede obtener los datos con el nombre con el método get_group.
data_2 = group_a.get_group(2)
print data_2
a b c 0 2 4 7 1 2 3 6 [2 rows x 3 columns]
Funciones sobre groupby¶
Usando el método apply se puede aplicar una función sobre un groupby y optener nuevamente un dataframe. Por ejemplo si se requiere calcular la suma de los valores de cada grupo:
data_sum = df.groupby('a').apply(sum)
print data_sum
a b c a 2 4 7 13 3 6 11 12 4 12 9 17 [3 rows x 3 columns]
Se puede aplicar sobre los grupos una función previamente creada. Se aplica una función llamada suma_rara que suma las columnas b y c de cada grupo y de ese resultado toma el menor valor a cada grupo.
def suma_rara(dataframe):
return min(dataframe['c'] + dataframe['b'])
data = df.groupby('a').apply(suma_rara)
print data
a 2 9 3 11 4 7 dtype: int64
Método agg¶
Se usa cuando se requiere un dataframe con valores específicos del grupo, por ejemplo para cada grupo de a se toma el primer valor de b y el último de c
data_esp = df.groupby('a').agg({'b':'first', 'c':'last'})
print data_esp
c b a 2 6 4 3 7 6 4 6 4 [3 rows x 2 columns]
Se pueden tomar en cada grupo mas de un valor por cada columna, en este caso se toma el promedio de los valores de b, el máximo de los valores de b y el mínimo de los valores de c de cada grupo:
data_esp = df.groupby('a').agg({'b':['mean', 'max'], 'c':'min'})
print data_esp
c b min mean max a 2 6 3.5 4 3 5 5.5 6 4 3 3.0 4 [3 rows x 3 columns]