У меня есть DataFrame
некоторых транзакций. Я хочу сгруппировать эти транзакции по значениям их столбцов item
и time
: цель состоит в том, чтобы сгруппировать элементы, которые находятся в пределах 1 часа друг от друга. Таким образом, мы начинаем новую группу во время следующего наблюдения, которое не было в пределах часа предыдущего наблюдения (см. столбец start time
в DataFrame
B
).
Вот данные: я хочу преобразовать A
в B
.
A=
item time result
A 2016-04-18 13:08:25 Y
A 2016-04-18 13:57:05 N
A 2016-04-18 14:00:12 N
A 2016-04-18 23:45:50 Y
A 2016-04-20 16:53:48 Y
A 2016-04-20 17:11:47 N
B 2016-04-18 15:24:48 N
C 2016-04-23 13:20:44 N
C 2016-04-23 14:02:23 Y
B=
item start time end time Ys Ns total count
A 2016-04-18 13:08:25 2016-04-18 14:08:25 1 2 3
A 2016-04-18 23:45:50 2016-04-18 00:45:50 1 0 1
A 2016-04-20 16:53:48 2016-04-20 17:53:48 1 1 2
B 2016-04-18 15:24:48 2016-04-18 16:24:48 0 1 1
C 2016-04-23 13:20:44 2016-04-23 14:20:44 1 1 2
Вот что я сделал:
grouped = A.groupby('item')
A['end'] = (grouped['time'].transform(lambda grp: grp.min()+pd.Timedelta(hours=1)))
A2 = A.loc[(A['time'] <= A['end'])]
Это дает мне одну группу в день: транзакция в течение 1 часа после первой транзакции. Итак, я пропускаю другие транзакции в тот же день, но с интервалом более 1 часа от первой. Моя борьба заключается в том, как получить эти группы. Затем я могу использовать pd.crosstab
для получения нужных сведений из столбца result
.
У меня есть еще одна идея: отсортировать A
по item
и time
, а затем пройтись по строкам. Если время находится в пределах 1 часа от предыдущей строки, оно добавляется в эту группу, в противном случае создается новая группа.
grouped
в вашем коде? Как ты получил это? - person MaxU   schedule 11.05.2016