Выполните группировку и агрегацию в Python Pandas

У меня есть кадр данных, который выглядит как

user    time15min             name                  is_purchase
A       2015-08-18 16:45:00   Words With Friends    0
A       2015-08-18 16:45:00   Clash of Clans        0
A       2015-08-18 16:45:00   Words With Friends    0
A       2015-08-18 16:45:00   Clash of Clans        1
A       2015-08-18 17:00:00   Sudoku                0
B       2015-08-18 17:00:00   Angry Birds           0
B       2015-08-18 17:00:00   Candy Crush           0
B       2015-08-18 17:00:00   Candy Crush           0
....

Столбец time15min содержит 15-минутный сегмент, в течение которого пользователь играл в игру на мобильном телефоне.

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

Итак, результат будет таким

 user   time15min             name                  purchase_made
  A     2015-08-18 16:45:00   Clash of Clans        1
  A     2015-08-18 17:00:00   Sudoku                0
  B     2015-08-18 17:00:00   Candy Crush           0 

В случае ничьей, как в первом случае для A, мы можем просто взять первый алфавит (в данном случае Clash of Clans).


person sfactor    schedule 02.09.2015    source источник


Ответы (1)


Вы можете применить рецепт из здесь

import pandas as pd
## read in your data from clipboard and get the columns right
df = pd.read_clipboard(sep='\s{2,}')

df.loc[:,'time15min'] = pd.to_datetime(df['time15min'])

## set the index to time15min, so df2 has a DateTimeIndex
df2 = df.set_index('time15min')

## Use .agg to count the names and total the purchases
df3=df2.groupby(['user',pd.TimeGrouper('15min'),'name']).agg({
                           'name':'count','is_purchase':'sum'})

## Create a mask to find the max for each group
mask = df3.groupby(level=[0,1]).agg('idxmax')
df3_count = df3.loc[mask['name']]

df3_count

Это дает следующий результат:

                                           name is_purchase
user    time15min           name        
A   2015-08-18 16:45:00     Clash of Clans  2   1
    2015-08-18 17:00:00     Sudoku          1   0
B   2015-08-18 17:00:00     Candy Crush     2   0
person TMrtSmith    schedule 02.09.2015
comment
Как вы создали df2 здесь? Я не совсем понял ту часть, где df2 создается из df. - person sfactor; 02.09.2015
comment
Извините, была опечатка: должно быть df2 = df.set_index('time15min') - person TMrtSmith; 02.09.2015