python r pandas plyr dplyr

plyr o dplyr en Python



pandas (4)

Esta es más una pregunta conceptual, no tengo un problema específico.

Estoy aprendiendo python para el análisis de datos, pero estoy muy familiarizado con R: una de las mejores cosas de R es plyr (y por supuesto ggplot2) y aún mejor dplyr. Por supuesto, los pandas también tienen aplicación dividida, pero en RI pueden hacer cosas como (en dplyr, un poco diferente en plyr, y ahora puedo ver cómo dplyr imita la notación de la programación de objetos).

data %.% group_by(c(.....)) %.% summarise(new1 = ...., new2 = ...., ..... newn=....)

en el que creo múltiples cálculos de resumen al mismo tiempo

¿Cómo hago eso en python, porque

df[...].groupby(.....).sum() only sums columns,

mientras que en RI puede tener una media, una suma, una función especial, etc. en una llamada

Me doy cuenta de que puedo realizar todas mis operaciones por separado y combinarlas, y eso está bien si estoy usando python, pero cuando se trata de elegir una herramienta, cualquier línea de código en la que no tenga que escribir, verificar y validar se suma en hora

además, en dplyr también puedes agregar declaraciones de mutate, así que me parece que es mucho más poderoso, entonces, ¿qué me falta de pandas o python?

Mi objetivo es aprender, he hecho un gran esfuerzo para aprender python y es una inversión valiosa, pero aún queda la pregunta.


Creo que estás buscando la función agg , que se aplica a los objetos groupby.

De los documentos:

In [48]: grouped = df.groupby(''A'') In [49]: grouped[''C''].agg([np.sum, np.mean, np.std]) Out[49]: sum mean std A bar 0.443469 0.147823 0.301765 foo 2.529056 0.505811 0.96


La forma más similar de usar dplyr en python es con el paquete dfply. Aquí hay un ejemplo.

R dplyr

library(nycflights13) library(dplyr) flights %>% filter(hour > 10) %>% # step 1 mutate(speed = distance / (air_time * 60)) %>% # step 2 group_by(origin) %>% # step 3a summarize(mean_speed = sprintf("%0.6f",mean(speed, na.rm = T))) %>% # step 3b arrange(desc(mean_speed)) # step 4 # A tibble: 3 x 2 origin mean_speed <chr> <chr> 1 EWR 0.109777 2 JFK 0.109427 3 LGA 0.107362

Python dfply

from dfply import * import pandas as pd flight_data = pd.read_csv(''nycflights13.csv'') (flight_data >> mask(X.hour > 10) >> # step 1 mutate(speed = X.distance / (X.air_time * 60)) >> # step 2 group_by(X.origin) >> # step 3a summarize(mean_speed = X.speed.mean()) >> # step 3b arrange(X.mean_speed, ascending=False) # step 4 ) Out[1]: origin mean_speed 0 EWR 0.109777 1 JFK 0.109427 2 LGA 0.107362

Python Pandas

flight_data.loc[flight_data[''hour''] > 10, ''speed''] = flight_data[''distance''] / (flight_data[''air_time''] * 60) result = flight_data.groupby(''origin'', as_index=False)[''speed''].mean() result.sort_values(''speed'', ascending=False) Out[2]: origin speed 0 EWR 0.109777 1 JFK 0.109427 2 LGA 0.107362

Nota : Para más información puedes consultar el siguiente link .


También soy un gran fan de dplyr para R y estoy trabajando para mejorar mi conocimiento de Pandas. Ya que no tiene un problema específico, sugeriría revisar la publicación a continuación que desglosa la viñeta introductoria completa y muestra cómo se puede hacer todo con Pandas.

Por ejemplo, el autor demuestra el encadenamiento con el operador de tubería en R:

flights %>% group_by(year, month, day) %>% select(arr_delay, dep_delay) %>% summarise( arr = mean(arr_delay, na.rm = TRUE), dep = mean(dep_delay, na.rm = TRUE) ) %>% filter(arr > 30 | dep > 30)

Y aquí está la implementación de Pandas:

flights.groupby([''year'', ''month'', ''day'']) [[''arr_delay'', ''dep_delay'']] .mean() .query(''arr_delay > 30 | dep_delay > 30'')

Hay muchas más comparaciones de cómo implementar operaciones de dplyr like con Pandas en la publicación original. http://nbviewer.ipython.org/gist/TomAugspurger/6e052140eaa5fdb6e8c0


Uno podría simplemente usar dplyr de Python.

Hay una interfaz para dplyr en rpy2 (introducida con rpy2-2.7.0) que le permite escribir cosas como:

dataf = (DataFrame(mtcars). filter(''gear>3''). mutate(powertoweight=''hp*36/wt''). group_by(''gear''). summarize(mean_ptw=''mean(powertoweight)''))

Hay un ejemplo en la documentación . Esta parte del documento es (también) un cuaderno jupyter. Busque los enlaces cerca de la parte superior de la página.

Otra respuesta a la pregunta es comparar el dplyr de R y los pandas (ver @lgallen). Las mismas instrucciones dplyr de encadenamiento de una línea R escriben esencialmente lo mismo en la interfaz de rpy2 a dplyr.

R:

flights %>% group_by(year, month, day) %>% select(arr_delay, dep_delay) %>% summarise( arr = mean(arr_delay, na.rm = TRUE), dep = mean(dep_delay, na.rm = TRUE) ) %>% filter(arr > 30 | dep > 30)

Python + rpy2:

(DataFrame(flights). group_by(''year'', ''month'', ''day''). select(''arr_delay'', ''dep_delay''). summarize(arr = ''mean(arr_delay, na.rm=TRUE)'', dep = ''mean(dep_delay, na.rm=TRUE)''). filter(''arr > 30 | dep > 30''))