Подтвердить что ты не робот

Plyr или dplyr в Python

Это скорее концептуальный вопрос, у меня нет конкретной проблемы.

Я изучаю python для анализа данных, но я очень хорошо знаком с R - одна из замечательных вещей о R - plyr (и, конечно же, ggplot2) и даже лучше dplyr. Pandas, конечно, имеет split-apply, но в R я могу делать такие вещи, как (в dplyr, немного отличается в plyr, и теперь я вижу, как dplyr имитирует нотацию от объектного программирования)

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

в котором я создаю несколько сводных вычислений в то же время

Как это сделать в python, потому что

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

а на R у меня может быть одно среднее, одна сумма, одна специальная функция и т.д. на один вызов

Я понимаю, что могу выполнять все свои операции отдельно и объединять их, и это нормально, если я использую python, но когда дело доходит до выбора инструмента, любая строка кода, которую вы не должны вводить, проверять и проверять складывается вовремя

Кроме того, в dplyr вы также можете добавить инструкции mutate, так что мне кажется, что это намного мощнее - так что мне не хватает о Pandas или python -

Моя цель - учиться, я потратил много усилий на изучение питона, и это достойная инвестиция, но все же остается вопрос

4b9b3361

Ответ 1

Я думаю, что вы ищете функцию agg, которая применяется к объектам groupby.

Из документов:

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

Ответ 2

Я также большой поклонник dplyr для R и работаю над улучшением моих знаний о Pandas. Поскольку у вас нет конкретной проблемы, я бы предложил проверить нижеприведенную запись, которая разбивает всю вступительную виньетку dplyr и показывает, как все это можно сделать с помощью Pandas.

Например, автор демонстрирует цепочку с оператором трубы в 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)

И вот реализация Pandas:

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

Есть много других сравнений, как реализовать dplyr, как операции с Pandas в исходном сообщении. http://nbviewer.ipython.org/gist/TomAugspurger/6e052140eaa5fdb6e8c0

Ответ 3

Можно просто использовать dplyr из Python.

В rpy2 (представленном с rpy2-2.7.0) есть интерфейс dplyr, который позволяет писать такие вещи, как:

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

В документации есть . Эта часть документа представляет собой (также) блокнот jupyter. Найдите ссылки в верхней части страницы.

Другой ответ на вопрос заключается в сравнении R dplyr и pandas (см. @lgallen). То же самое R однолинейное односвязное выражение dplyr записывает по существу то же самое в интерфейсе rpy2 в 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'))

Ответ 4

Наиболее похожий способ использования dplyr в python - это пакет dfply. Вот пример.

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

Питон Панды

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

Примечание: для получения дополнительной информации вы можете проверить следующую ссылку.