2017-01-18 1 views
2

Я довольно хорошо знаком с R dplyr для анализа данных, и я пытаюсь преобразовать часть кода, который я написал в dplyr, в pandas. У меня есть данные, у которых есть человек, идентифицированный столбцом ID и DATE, на котором это лицо использовало определенный ПРОДУКТ. Я пытаюсь найти лучший способ преобразования следующего кода R dplyr в код pandon pandas. В принципе, я группирую по столбцу идентификатор, фильтрую для определенного типа продукта, а затем добавляю столбец, который (для каждой строки в группе) добавляет минимальную (сначала использованную) дату и максимальную (последнюю использованную) дату для этого человека и продукт. Наконец, я также добавляю столбец, который вычисляет количество дней между последней используемой и первой используемой датой. Вот данные:Python Pandas groupby и мутирует новый столбец с групповыми вычислениями ala dplyr

ID PRODUCT DATE 
A ITEM1 1/30/15 
B ITEM1 2/23/14 
A ITEM2 3/22/15 
C ITEM1 1/23/12 
B ITEM1 4/12/15 
A ITEM3 2/2/14 
C ITEM1 1/1/17 
A ITEM1 2/20/15 
A ITEM1 5/18/15 

с помощью dplyr я могу сделать

library(dplyr) 
library(lubridate) 

df <- df %>% 
mutate(DATE = mdy(DATE)) %>% 
group_by(ID) %>% 
filter(PRODUCT == "Item1") %>% 
mutate(FIRST = min(DATE), LAST = max(DATE), DAYS = LAST - FIRST) 

, который дает мне

 ID PRODUCT  DATE  FIRST  LAST  DAYS 
    (fctr) (fctr)  (time)  (time)  (time) (dfft) 
1  A ITEM1 2015-01-30 2015-01-30 2015-05-18 108 days 
2  B ITEM1 2014-02-23 2014-02-23 2015-04-12 413 days 
3  C ITEM1 2012-01-23 2012-01-23 2017-01-01 1805 days 
4  B ITEM1 2015-04-12 2014-02-23 2015-04-12 413 days 
5  C ITEM1 2017-01-01 2012-01-23 2017-01-01 1805 days 
6  A ITEM1 2015-02-20 2015-01-30 2015-05-18 108 days 
7  A ITEM1 2015-05-18 2015-01-30 2015-05-18 108 days 

данных:

df <- structure(list(ID = structure(c(1L, 2L, 1L, 3L, 2L, 1L, 3L, 1L, 1L), .Label = c("A", "B", "C"), class = "factor"), 
       PRODUCT = structure(c(1L, 1L, 2L, 1L, 1L, 3L, 1L, 1L, 1L), .Label = c("ITEM1", "ITEM2", "ITEM3"), class = "factor"), 
       DATE = structure(c(3L, 6L, 7L, 2L, 8L, 4L, 1L, 5L, 9L), 
           .Label = c("1/1/17", "1/23/12", "1/30/15", "2/2/14", "2/20/15", "2/23/14", "3/22/15", "4/12/15", "5/18/15"), 
           class = "factor")), 
       .Names = c("ID", "PRODUCT", "DATE"), class = "data.frame", row.names = c(NA, -9L)) 

Как я могу сделать то же самое панды?

ответ

1

с использованием agg + groupby

funcs = dict(FIRST='min', LAST='max', DAYS=np.ptp) 
d1 = df.join(df.groupby(['ID', 'PRODUCT']).DATE.agg(funcs), on=['ID', 'PRODUCT']) 

enter image description here

+0

Как насчет функции 'преобразование'? – Wen

+0

@ Как насчет функции 'transform'? – piRSquared

+0

@piRSquared Что-то вроде df ['SUM'] = df.groupby ('A') ['B']. Transform (sum), но я не знаю, может ли эта функция добавить несколько результатов за один раз. – Wen

Смежные вопросы