Объединение двух панелей данных при фильтрации и агрегации - PullRequest
1 голос
/ 04 июня 2019

У меня есть два кадра данных панд.Один из них имеет следующий формат:

|Customer ID | Login_Session_Start_Time | Login_Session_End_Time | 
|------------|--------------------------|------------------------|
|   1        | 2018-04-05 10:03:23      |  2018-04-05 10:15:12   |
|   1        | 2018-04-19 22:12:42      |  2018-04-19 22:45:11   | 
|   2        | 2018-04-01 08:23:14      |  2018-04-01 14:34:01   |
........

, в котором указывается, сколько времени каждый клиент провел на определенном веб-сайте.У меня также есть другой фрейм данных из другого источника, в котором перечислены, что они купили и в какое время.Это выглядит так:

| Customer ID |  Purchase Description    | Purchase Time        |
|-------------|--------------------------|----------------------|
|     1       | Shirt                    | 2018-04-05 10:11:04  |
|     2       | Pants                    | 2018-04-01 09:35:13  |
|     2       | Shirt                    | 2018-04-01 13:12:09  |

.........

Мне нужно объединить два кадра данных таким образом, чтобы он сообщал мне, сколько элементов каждого видаклиент покупал в течение каждого сеанса входа в систему.Таким образом, для приведенного выше примера это будет выглядеть следующим образом:

|Customer ID | Login_Session_Start_Time | Login_Session_End_Time | Num_Shirts | Num_Pants |
|------------|--------------------------|------------------------|------------|-----------|
|   1        | 2018-04-05 10:03:23      |  2018-04-05 10:15:12   |   1        |        0  |
|   2        | 2018-04-01 08:23:14      |  2018-04-01 14:34:01   |   1        |        1  |
 .....

Таким образом, это потребует слияния во время фильтрации (когда время покупки находится в пределах Login_Session_Start_Time и Login_Session_End_Time), группировки (по описанию покупки) и, возможно, поворота.

Единственный способ, которым я мог думать об этом, - это циклически проходить по каждой строке первого кадра данных, а затем в цикле выбирать субкадр второго кадра данных с соответствующим идентификатором клиента и временем покупки в пределахпределы первой строки, затем группировка и поворот этого субкадра, затем сборка всех этих субкадров вместе в последний.Это работает, но очень медленно, особенно с фреймами данных с сотнями тысяч строк.

Есть ли лучший способ сделать это?Спасибо за вашу помощь!

Ответы [ 2 ]

1 голос
/ 04 июня 2019

Попробуйте использовать два pd.DataFrame.groupby с pd.DataFrame.join и pd.get_dummies:

print(df.groupby('Customer ID', as_index=False).first().join(pd.get_dummies(df2, columns=['Purchase Description']).groupby(['Customer ID'], as_index=False).sum().iloc[:, 1:]))

Вывод:

   Customer ID Login_Session_Start_Time Login_Session_End_Time  \
0            1        20180405 10:03:23      20180405 10:15:12   
1            2        20180401 08:23:14      20180401 14:34:01   

   Purchase Description_Pants  Purchase Description_Shirt  
0                           0                           1  
1                           1                           1
0 голосов
/ 04 июня 2019

Мне хочется слияния и series.between() для сравнения, если покупка в течение сессии:

m=df1.merge(df2,on='Customer ID')
m=m[m['Purchase Time'].between(m['Login_Session_Start_Time'],m['Login_Session_End_Time'])]
m=(pd.get_dummies(m.drop('Purchase Time',1),columns=['Purchase Description'],
                                                     prefix='',prefix_sep=''))

Customer ID Login_Session_Start_Time    Login_Session_End_Time  Pants   Shirt
0   1       2018-04-05 10:03:23         2018-04-05 10:15:12         0       1
2   2       2018-04-01 08:23:14         2018-04-01 14:34:01         1       0
3   2       2018-04-01 08:23:14         2018-04-01 14:34:01         0       1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...