2013-05-22 12 views
5

Ho una cornice dati panda come quella qui sotto.Pandas raggruppano per operazioni su un frame dati

UsrId JobNos 
1  4 
1  56 
2  23 
2  55 
2  41 
2  5 
3  78 
1  25 
3  1 

I gruppo dal frame di dati basato su UsrId. La cornice dati raggruppata apparirà concettualmente come di seguito.

UsrId JobNos 
    1 [4,56,25] 
    2 [23,55,41,5] 
    3 [78,1] 

Ora, sto cercando un'API in-build che mi fornirà l'UsrId con il numero massimo di lavori. Per l'esempio precedente, UsrId-2 ha il conteggio massimo.

UPDATE: Invece del usrid con numero massimo di posti di lavoro, voglio 'n' userids con i conteggi massimo di posti di lavoro. Per l'esempio precedente, se n = 2, l'output è [2,1]. Può essere fatto?

risposta

10

Qualcosa di simile df.groupby('UsrId').JobNos.sum().idxmax() dovrebbe farlo:

In [1]: import pandas as pd 

In [2]: from StringIO import StringIO 

In [3]: data = """UsrId JobNos 
    ...: 1  4 
    ...: 1  56 
    ...: 2  23 
    ...: 2  55 
    ...: 2  41 
    ...: 2  5 
    ...: 3  78 
    ...: 1  25 
    ...: 3  1""" 

In [4]: df = pd.read_csv(StringIO(data), sep='\s+') 

In [5]: grouped = df.groupby('UsrId') 

In [6]: grouped.JobNos.sum() 
Out[6]: 
UsrId 
1   85 
2  124 
3   79 
Name: JobNos 

In [7]: grouped.JobNos.sum().idxmax() 
Out[7]: 2 

Se si desidera che i risultati in base al numero di oggetti in ogni gruppo:

In [8]: grouped.size() 
Out[8]: 
UsrId 
1  3 
2  4 
3  2 

In [9]: grouped.size().idxmax() 
Out[9]: 2 

Aggiornamento: risultati per ottenere ordinato che puoi utilizzare il metodo .order:

In [10]: grouped.JobNos.sum().order(ascending=False) 
Out[10]: 
UsrId 
2  124 
1   85 
3   79 
Name: JobNos 
+0

grazie per la soluzione. Funziona. Ho aggiornato la mia domanda. Puoi dare un'occhiata e suggerire una soluzione per la domanda aggiornata. –

+0

@AnirudhNair - aggiornato ... – root

Problemi correlati