Сгруппируйте все строки, попадающие в одно и то же время, в корзину - PullRequest
0 голосов
/ 12 мая 2018

Я пытаюсь определить, какие приложения использовались в разных сеансах.По сути, я определяю каждые 5 минут как сеанс и хотел бы знать, сколько мобильных сеансов имеется в наборе данных.Кроме того, я хотел бы знать, какие приложения были запущены в каждой сессии.Все строки в моем фрейме данных помечены временем.Вот пример из набора данных:

        timestamp               App
6773    2018-04-08 09:47:57.849 Chrome
6774    2018-04-08 09:48:17.573 YouTube
6775    2018-04-08 09:48:28.538 Instagram
6776    2018-04-08 09:48:37.381 Maps
6777    2018-04-08 09:48:46.680 Netflix
6778    2018-04-08 09:48:56.672 Google Play Store
6779    2018-04-08 09:56:58.880 Google
6780    2018-04-08 09:57:25.461 DB Navigator
6781    2018-04-08 11:28:38.762 Google
6782    2018-04-08 12:58:31.455 Google
6783    2018-04-08 14:31:18.131 Google
6784    2018-04-08 14:31:29.209 Google
6785    2018-04-08 14:58:42.875 Google
6786    2018-04-08 18:18:04.757 Chrome
6787    2018-04-08 21:08:41.368 Google
6788    2018-04-11 10:53:10.744 Google
6789    2018-04-14 19:54:37.441 Google
6790    2018-04-14 19:54:59.833 Google
6791    2018-04-14 19:55:10.844 YouTube
6792    2018-04-14 19:55:34.486 Google
6793    2018-04-14 20:23:00.315 Google
6794    2018-04-15 08:23:44.873 Google
6795    2018-04-15 08:24:07.257 Google

Это требуемый вывод, где добавляется новый столбец с именем SessionID, определяющий идентификатор текущего сеанса.

        timestamp               App                     SessionID
6773    2018-04-08 09:47:57.849 Chrome                  1
6774    2018-04-08 09:48:17.573 YouTube                 1
6775    2018-04-08 09:48:28.538 Instagram               1
6776    2018-04-08 09:48:37.381 Maps                    1
6777    2018-04-08 09:48:46.680 Netflix                 1
6778    2018-04-08 09:48:56.672 Google Play Store       1
6779    2018-04-08 09:56:58.880 Google                  2
6780    2018-04-08 09:57:25.461 DB Navigator            2
6781    2018-04-08 11:28:38.762 Google                  3
6782    2018-04-08 12:58:31.455 Google                  4
6783    2018-04-08 14:31:18.131 Google                  5
6784    2018-04-08 14:31:29.209 Google                  5
6785    2018-04-08 14:58:42.875 Google                  6
6786    2018-04-08 18:18:04.757 Chrome                  7
6787    2018-04-08 21:08:41.368 Google                  8
6788    2018-04-11 10:53:10.744 Google                  9
6789    2018-04-14 19:54:37.441 Google                  10
6790    2018-04-14 19:54:59.833 Google                  10
6791    2018-04-14 19:55:10.844 YouTube                 10
6792    2018-04-14 19:55:34.486 Google                  10
6793    2018-04-14 20:23:00.315 Google                  11
6794    2018-04-15 08:23:44.873 Google                  12
6795    2018-04-15 08:24:07.257 Google                  12  

Ответы [ 3 ]

0 голосов
/ 12 мая 2018

Вот компактная версия с использованием np.unique

min5 = df['timestamp'].astype(np.int64)//(10**9*5*60)
df['SessionID'] = np.unique(min5, return_inverse=True)[1]+1

Как приятно заметил @ Dav2357, ваша группа 10 включает 55. что-то. Я предполагаю, что это ошибка, но ее можно исправить, удалив первое значение (если это ваша база):

s = df['timestamp'].astype(np.int64)
df['SessionID'] = np.unique((s-s[0])//(10**9*5*60), return_inverse=True)[1]+1

Объяснение: мы используем тот факт, что мы можем преобразовать объекты даты и времени в наносекунды с .astype(np.int64). Затем мы делим на (10**9**5*60), чтобы получить делитель.

Делитель - это значение, равное значениям в одном и том же 5-минутном интервале.

import pandas as pd
import numpy as np

data = '''\
2018-04-08T09:47:57.849,Chrome
2018-04-08T09:48:17.573,YouTube
2018-04-08T09:48:28.538,Instagram
2018-04-08T09:48:37.381,Maps
2018-04-08T09:48:46.680,Netflix
2018-04-08T09:48:56.672,Google Play Store
2018-04-08T09:56:58.880,Google
2018-04-08T09:57:25.461,DB Navigator
2018-04-08T11:28:38.762,Google
2018-04-08T12:58:31.455,Google
2018-04-08T14:31:18.131,Google
2018-04-08T14:31:29.209,Google
2018-04-08T14:58:42.875,Google
2018-04-08T18:18:04.757,Chrome
2018-04-08T21:08:41.368,Google
2018-04-11T10:53:10.744,Google
2018-04-14T19:54:37.441,Google
2018-04-14T19:54:59.833,Google
2018-04-14T19:55:10.844,YouTube
2018-04-14T19:55:34.486,Google
2018-04-14T20:23:00.315,Google
2018-04-15T08:23:44.873,Google
2018-04-15T08:24:07.257,Google'''

df = pd.read_csv(pd.compat.StringIO(data), names=['timestamp','App'], parse_dates=[0])
s = df['timestamp'].astype(np.int64)
df['SessionID'] = np.unique((s-s[0])//(10**9*5*60), return_inverse=True)[1]+1

print(df)

Возвращает:

                 timestamp                App  SessionID
0  2018-04-08 09:47:57.849             Chrome          1
1  2018-04-08 09:48:17.573            YouTube          1
2  2018-04-08 09:48:28.538          Instagram          1
3  2018-04-08 09:48:37.381               Maps          1
4  2018-04-08 09:48:46.680            Netflix          1
5  2018-04-08 09:48:56.672  Google Play Store          1
6  2018-04-08 09:56:58.880             Google          2
7  2018-04-08 09:57:25.461       DB Navigator          2
8  2018-04-08 11:28:38.762             Google          3
9  2018-04-08 12:58:31.455             Google          4
10 2018-04-08 14:31:18.131             Google          5
11 2018-04-08 14:31:29.209             Google          5
12 2018-04-08 14:58:42.875             Google          6
13 2018-04-08 18:18:04.757             Chrome          7
14 2018-04-08 21:08:41.368             Google          8
15 2018-04-11 10:53:10.744             Google          9
16 2018-04-14 19:54:37.441             Google         10
17 2018-04-14 19:54:59.833             Google         10
18 2018-04-14 19:55:10.844            YouTube         10
19 2018-04-14 19:55:34.486             Google         10
20 2018-04-14 20:23:00.315             Google         11
21 2018-04-15 08:23:44.873             Google         12
22 2018-04-15 08:24:07.257             Google         12

Timecomparison:

1000 loops, best of 3: 962 µs per loop   <-- Anton-vBR 
1000 loops, best of 3: 1.34 ms per loop  <-- Dav2357 
1000 loops, best of 3: 1.43 ms per loop  <-- Wen
0 голосов
/ 12 мая 2018

@ Вэнь, @Anton vBR, поправьте меня, если я ошибаюсь, но, похоже, ваши решения возвращают другую корзину для 6791 6792 относительно желаемого результата, отправленного OP.Я попробовал этот способ, и он получает эти два права:

start_t=df["Timestamp"].iloc[0]
df["ID"]=pd.factorize(df["Timestamp"].apply(lambda x: int((x-start_t).total_seconds()/60) // 5 ))[0]+1

Вывод:

                    App               Timestamp  ID
6773             Chrome 2018-04-08 09:47:57.849   1
6774            YouTube 2018-04-08 09:48:17.573   1
6775          Instagram 2018-04-08 09:48:28.538   1
6776               Maps 2018-04-08 09:48:37.381   1
6777            Netflix 2018-04-08 09:48:46.680   1
6778  Google Play Store 2018-04-08 09:48:56.672   1
6779             Google 2018-04-08 09:56:58.880   2
6780       DB Navigator 2018-04-08 09:57:25.461   2
6781             Google 2018-04-08 11:28:38.762   3
6782             Google 2018-04-08 12:58:31.455   4
6783             Google 2018-04-08 14:31:18.131   5
6784             Google 2018-04-08 14:31:29.209   5
6785             Google 2018-04-08 14:58:42.875   6
6786             Chrome 2018-04-08 18:18:04.757   7
6787             Google 2018-04-08 21:08:41.368   8
6788             Google 2018-04-11 10:53:10.744   9
6789             Google 2018-04-14 19:54:37.441  10
6790             Google 2018-04-14 19:54:59.833  10
6791            YouTube 2018-04-14 19:55:10.844  10
6792             Google 2018-04-14 19:55:34.486  10
6793             Google 2018-04-14 20:23:00.315  11
6794             Google 2018-04-15 08:23:44.873  12
6795             Google 2018-04-15 08:24:07.257  12
0 голосов
/ 12 мая 2018

Вы можете округлить до ближайших 5 минут, затем используя factorize

fivemin=5*60*1000000000 
s=pd.to_datetime(((df.timestamp.astype(np.int64) // fivemin + 1 ) * fivemin))
df['new']=pd.factorize(s.astype(str))[0]+1
df
Out[66]: 
                    App               timestamp  new
6773             Chrome 2018-04-08 09:47:57.849    1
6774            YouTube 2018-04-08 09:48:17.573    1
6775          Instagram 2018-04-08 09:48:28.538    1
6776               Maps 2018-04-08 09:48:37.381    1
6777            Netflix 2018-04-08 09:48:46.680    1
6778  Google Play Store 2018-04-08 09:48:56.672    1
6779             Google 2018-04-08 09:56:58.880    2
6780       DB Navigator 2018-04-08 09:57:25.461    2
6781             Google 2018-04-08 11:28:38.762    3
6782             Google 2018-04-08 12:58:31.455    4
6783             Google 2018-04-08 14:31:18.131    5
6784             Google 2018-04-08 14:31:29.209    5
6785             Google 2018-04-08 14:58:42.875    6
6786             Chrome 2018-04-08 18:18:04.757    7
6787             Google 2018-04-08 21:08:41.368    8
6788             Google 2018-04-11 10:53:10.744    9
6789             Google 2018-04-14 19:54:37.441   10
6790             Google 2018-04-14 19:54:59.833   10
6791            YouTube 2018-04-14 19:55:10.844   11
6792             Google 2018-04-14 19:55:34.486   11
6793             Google 2018-04-14 20:23:00.315   12
6794             Google 2018-04-15 08:23:44.873   13
6795             Google 2018-04-15 08:24:07.257   13
...