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 -
Моя цель - учиться, я потратил много усилий на изучение питона, и это достойная инвестиция, но все же остается вопрос
Ответы
Ответ 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
Примечание: для получения дополнительной информации вы можете проверить следующую ссылку.