No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Group By: extraer valor con variables categóricas

21/28
Recursos

Aportes 21

Preguntas 3

Ordenar por:

Los aportes, preguntas y respuestas son vitales para aprender en comunidad. Regístrate o inicia sesión para participar.

Mi resumen sobre groupby y aggregate 😃

- groupby: para aplicar una función a un conjunto de datos. Se puede usar de varias formas

  1. Forma simple
df.groupby('column1').function

Donde function puede ser: mean(), median(), etc. En este sentido, Pandas tomará a ‘column1’ como índice y al resto del dataframe le aplicará la función definida.

  1. Con funciones lambdas o auxiliares
df.groupby('column1')[['column2','column3']].apply(some_function)

Donde some_function pueden ser funciones lambdas u otras que hayamos definido. En esta operación, Pandas tomará a ‘column1’ como índice y las columnas serán el resultado de aplicar some_function sobre ‘column2’ y ‘column3’.

Nota: también pueden tomarse varias columnas como índices escribiendolas en una lista.

- aggregate (o agg): para aplicar más de una función. La sintaxis de esta función sigue la misma lógica que la de groupby, solo que se añade ‘agg’ (o ‘aggregate’) al final de la sentencia con una lista de funciones a aplicar. Ejemplos:

df.groupby('column1').agg([np.mean,np.max])

df.groupby(['column1','column2'])[['column3','column4']].aggregate([np.mean,np.max])

De igual manera, Pandas realizará lo siguiente:

  • tomará como índice las columnas que esten entre paréntesis.
  • tomará como columnas el resultado de aplicar las funciones especificadas en ‘aggregate’ a la lista de columnas entre corchetes.

Si a alguien más le surgió la duda, se puede crear categorías a nivel de cuantiles utilizando pd.qcut, por ejemplo para deciles:

<pd.qcut(df["total_bill"], q = 10)>

Otra forma de saber cuantas personas fuman o no sin necesidad de crear una nueva columna ones es mediante:

df[["sex","smoker"]].value_counts().to_frame()

Las agrupaciones que hace el profesor usando la columna auxiliar ‘ones’ para tener proporciones también se puede hacer con value_counts(normalize=True).
Para el último ejemplo:

df.groupby(['time'])['bin_total'].value_counts(normalize=True).to_frame()*100

Devuelve este dataframe

Me anduve confundiendo un poco, porque no entendía que era x en esta parte del código.

df_g.groupby(level=0).apply(
    lambda x:
    x / x.sum() * 100
)

Por lo que entiendo “x” es la parte del dataframe que esta agrupada por Male y luego “x” toma el valor cuando es agrupada por Female. Entonces como es un dataframe y .sum() aplica para los datos que son int o float, suma los datos de ones y se obtiene el total de Male y Female respectivamente.

Si no estoy en lo correcto por favor corregirme.
muchas gracias

pd.cut(df[“col”],bins=#)
Permite segmentar datos en intervalos (#)

Es muy bueno este curso, súper práctico. Me anima a empezar a hacer proyectos.

Para quienes tienen problemas con cómo funciona level

Tomemos el último ejemplo dado por el profesor, calcular el promedio de gasto en base a los rangos de gastos y el tiempo (Lunch, Dinner). El profesor lo calculó así:

df.groupby(['time', 'bin_total'])[['ones']].count().groupby(level=0).apply(
    lambda x:
    x / x.sum()*100
)

level=0 significa, en este caso, que vamos a calcular el promedio en base a los datos que hay en la columna time, es decir, se calcula con el total de datos presentes en Lunch (68 datos) y en Dinner (que son 176 en total) respectivamente.
En cambio, si asignamos level=1, significa que trabajaremos con la cantidad datos presentes en cada rango de bin_total, por ejemplo, para el rango [3, 18] existen 127 datos, por ello, en la columna Lunch, como hay 45 valores en este rango, lo divide por los 127 totales y se obtiene el resultado de 35.43%.

Básicamente, level indica sobre qué datos de qué columna trabajaremos en el caso de ser un dataframe multi-índice.

Gracias, por todos los ejemplos

interesante

df_g = df.groupby(['sex', 'smoker'])[['ones']].sum()

TypeError: Argument 'arr' has incorrect type (expected numpy.ndarray, got Categorical)

A seguir aprendiendo y estos TIPS son muy importantes para generar información que nos ayude a decidir.

A esto le llamo contenido de calidad 😄

otra forma:

df.groupby(['sex','smoker'])[['smoker']].count()

Con todo lo que hemos aprendido, ya he podido empezar con mi proyecto de análisis de datos. Espero poder terminarlo 😄

Yo lo que quiero es una forma de hacer como un split de fechas.
Digamos que tengo algo así:

pd.cut(contratos['Fecha de inicio del contrato'],bins=8).value_counts().to_frame().sort_index()

Y me sale algo así:

Me gustaría controlar los intervalos de las fechas

Articulo sobre variables categóricas Articulo Variables

Algo a tener en cuenta cuando se coloca level
Para level=0

df_g.groupby(level=0).apply(lambda x: x/x.sum()*100)

dará el porcentaje teniendo en cuenta el género, es decir, que porcentaje de los hombres y mujeres fuman.

Para level=1

df_g.groupby(level=1).apply(lambda x: x/x.sum()*100)

dará el porcentaje teniendo en cuenta las personas que fuman o no, es decir, que porcentaje de los que fuman es mujer y hombre y que porcentaje de los que no fuman es hombre o mujer.

No sé si sea el descubrimiento del siglo, pero la columna de ‘ones’ se puede reemplazar con la función

pandas.dataframe.count()

Ya que Count arroja los conteos individuales de las columnas o sus grupos.

¿Qué aprendimos en las últimas dos clases?

Aprendimos a como usar la función Groupby para extraer valor usando las dos categorías que caponen el DataFrame.

Otra forma de ver los porcentajes de los smokers:

df['ones']= 1
df.groupby(['sex','smoker'])['ones'].sum()/244*100