Я довольно хорошо знаком с 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))
Как я могу сделать то же самое панды?
Как насчет функции 'преобразование'? – Wen
@ Как насчет функции 'transform'? – piRSquared
@piRSquared Что-то вроде df ['SUM'] = df.groupby ('A') ['B']. Transform (sum), но я не знаю, может ли эта функция добавить несколько результатов за один раз. – Wen