2016-09-27 3 views
1

Используя Pandas groupby, у меня есть данные о том, сколько активности у определенных пользователей в среднем в каждый данный день недели. Сгруппированный пользователем и днем, я вычисляю max и mean для нескольких пользователей за последние 30 дней.Используя методы Pandas groupby, найдите наибольшие значения в каждой группе

Теперь я хочу найти для каждого пользователя, какой день недели соответствует их ежедневной максимальной активности, и какова средняя величина этой активности.

Каков метод в пандах для выполнения такой задачи?

Исходные данные выглядит примерно так:

userID countActivity weekday 
0 3  25    5 
1 3  58    6 
2 3  778    0 
3 3  78208   1 
4 3  6672   2 

Объект, который имеет эти группы создается из следующих функций:

aggregations = { 
    'countActivity': { 
     'maxDaily': 'max', 
     'meanDaily': 'mean' 
    } 
} 

dailyAggs = df.groupby(['userID','weekday']).agg(aggregations) 

Объект GroupBy выглядит примерно так:

    countActivity  
       maxDaily meanDaily 
userID weekday  
3  0  84066  18275.6 
     1  78208  20698.5 
     2  172579  64930.75 
     3  89535  25443 
     4  6152  2809 

Pandas groupby способ filter, как представляется, необходим здесь, но Я не понимаю, как действовать.

+2

Можете ли вы предоставить воспроизводимый образец данных ввода данных и желаемый набор данных? – MaxU

ответ

3

Сначала я сделал groupby по телефону 'userID', а затем написал функцию apply, чтобы сделать все остальное. Функция apply примет группу 'userID', выполнив другую команду groupby на 'weekday', чтобы выполнить ваши агрегации, а затем верните только строку, которая содержит максимальное значение для maxDaily, которое может быть найдено с помощью argmax.

def get_max_daily(grp): 
    aggregations = {'countActivity': {'maxDaily': 'max', 'meanDaily': 'mean'}} 
    grp = grp.groupby('weekday').agg(aggregations).reset_index() 
    return grp.loc[grp[('countActivity', 'maxDaily')].argmax()] 

result = df.groupby('userID').apply(get_max_daily) 

Я добавил строку данных выборки, чтобы убедиться, что ежедневные агрегирование работали правильно, так как ваши данные выборки содержит только одну запись для каждого дня недели:

userID countActivity weekday 
0  3    25  5 
1  3    58  6 
2  3   778  0 
3  3   78208  1 
4  3   6672  2 
5  3   78210  1 

Полученный выход:

 weekday countActivity   
        meanDaily maxDaily 
userID        
3   1   78209 78210 
Смежные вопросы