Digamos que eu tenha um log de atividade do usuário e desejo gerar um relatório de duração total e o número de usuários únicos por dia.
import numpy as np
import pandas as pd
df = pd.DataFrame({'date': ['2013-04-01','2013-04-01','2013-04-01','2013-04-02', '2013-04-02'],
'user_id': ['0001', '0001', '0002', '0002', '0002'],
'duration': [30, 15, 20, 15, 30]})
Agregar a duração é bastante simples:
group = df.groupby('date')
agg = group.aggregate({'duration': np.sum})
agg
duration
date
2013-04-01 65
2013-04-02 45
O que eu gostaria de fazer é somar a duração e contar as distinções ao mesmo tempo, mas não consigo encontrar um equivalente para count_distinct:
agg = group.aggregate({ 'duration': np.sum, 'user_id': count_distinct})
Isso funciona, mas certamente há uma maneira melhor, não?
group = df.groupby('date')
agg = group.aggregate({'duration': np.sum})
agg['uv'] = df.groupby('date').user_id.nunique()
agg
duration uv
date
2013-04-01 65 2
2013-04-02 45 1
Estou pensando que só preciso fornecer uma função que retorne a contagem de itens distintos de um objeto Series para a função agregada, mas não tenho muito contato com as várias bibliotecas à minha disposição. Além disso, parece que o objeto groupby já conhece essa informação, então eu não estaria apenas duplicando o esforço?
nunique
diretamente. Veja a solução de @Blodwyn Pig abaixo'nunique' é uma opção para .agg () desde pandas 0.20.0, então:
fonte
duration: np.unique
df.groupby('date').agg({'user_id': lambda s: s.unique().reset_index(drop=True)})
Apenas adicionando as respostas já fornecidas, a solução usando a string
"nunique"
parece muito mais rápida, testada aqui em um dataframe de aproximadamente 21 milhões de linhas e agrupada em aproximadamente 2 milhõesfonte