TransWikia.com

Agrupar valores de una columna y promediar los de otra con base en el agrupamiento en Pandas Python

Stack Overflow en español Asked by frnndovelasco on January 6, 2022

Tengo un dataframe con los siguientes datos

     price     neighbourhood
0   $2,331.00   San Rafael
1   $4,457.00   Roma Norte
2   $809.00     San Rafael
3   $1,932.00   Roma Norte
4   $1,364.00   Coyoacán
5   $1,202.00   Coyoacán

Busco crear un nuevo dataframe que contenga en una columna el agrupamiento de los valores de "neighbourhood" (sólo una fila por valor único) y en otras columnas el promedio, la media, los percentiles y la moda de ser posible de los datos en la columna "price". Algo así

He logrado sacar los datos individuales por valor en "neighbourhood" creando filtros con iloc, pero no he encontrado la forma de hacerlo todo en un conjunto en un mismo dataframe, sin la necesidad de pegar los dataframes que ya hice (puesto que tengo más de mil registros únicos). Por lo que buscaba la forma de hacerlo todo de una sentada, de ser posible, claro.

Para sacar los datos que busco sólo lo he logrado colonia por colonia en un dataframe diferente, con este código

df_roma_norte = df[df["neighbourhood] == "Roma Norte"]
 
df_roma_norte[df_roma_norte.columns[0:1]] = df_roma_norte[df_roma_norte.columns[0:1]].replace('[$,]', '', regex=True).astype(float)
df_roma_norte.describe()

Y lo que sale

         price
count   1747.000000
mean    1524.350887
std     2843.552880
min     0.000000
25%     591.000000
50%     1083.000000
75%     1716.000000
max 98381.00000

lo copio y lo pego de manera manual, haciendo esto para cada uno de los datos únicos que tengo en la columna "neighbourhood". Termino con cientos de dataframes. Muy poco práctico. No he podido lograr que las operaciones que pandas logra en un describe() apliquen para datos agrupados como valores únicos en mi columna "neighbourhood".

Lo que yo busco es obtener esto, donde Pandas hizo las operaciones agrupando todos los valores de "neighbourhood" y haciendo las operaciones en describe, pero no para todo el dataframe, sino para los grupos de datos de "neighbourhood" (Los percentiles y promedios de los precios de San Rafael, los percentiles y promedios de Roma Norte, etc:

neighbourhood  mean   25%   50%   75%   etc
San Rafael     1570   100   500   1200
Roma Norte     3194.5 200   600   1500  
Coyoacán       1283   50    400   1000

Saludos y gracias de antemano.

One Answer

Encontré una respuesta un poco más práctica a mi propia pregunta.

Tendría que agrupar los valores y a partir de ello crear una operación. Lo malo es que la operación tiene que hacerse por cada resultado que busque (promedio, moda, mediana, etc). Lo bueno es que con eso se reduce mucho el número de dataframes que tengo que crear (por colonia eran cientos, de esta forma son como mínimo 5).

df_colonia_y_precio = df[["price","neighbourhood"]]
df_promedio = df_colonia_y_precio.groupby("neighbourhood", as_index=False).mean()
df_mediana = df_colonia_y_precio.groupby("neighbourhood", as_index=False).median()
df_totales = df_colonia_y_precio.groupby("neighbourhood", as_index=False).count()
df_todos_los_datos = pd.merge(df_promedio, df_mediana, on="neighbourhood")
df_todos_los_datos = pd.merge(df_todos_los_datos, df_totales, on ="neighbourhood")
df_todos_los_datos.columns= ["colonia", "promedio", "mediana", "total_de_espacios"]

Y esto devuelve este dataframe:

     colonia                   promedio       mediana        total_de_espacios
0   Acacias/Actipan            1072.402597    646.0              77
1   Alamos                     589.680851     490.0              141
2   Americas Unidos/Del Lago   619.897436     446.0              39
3   Anzures                    1178.327451    1048.0             510
4   Asturias                   600.603448     495.0              36

Muchas gracias a todos.

Answered by frnndovelasco on January 6, 2022

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP