2013-07-30 9 views
11

Nella seguente frammento data è un pandas.DataFrame e indices è un insieme di colonne della data. Dopo aver raggruppato i dati con groupby, sono interessato agli ID dei gruppi, ma solo a quelli con una dimensione maggiore di una soglia (ad esempio: 3).Pandas groupby: le dimensioni di un gruppo conoscendo la sua identificazione (da .grouper.group_info [0])

group_ids=data.groupby(list(data.columns[list(indices)])).grouper.group_info[0] 

Ora, come posso trovare quale gruppo ha una dimensione maggiore o uguale a 3 conoscendo l'id del gruppo? Voglio solo id di gruppi con una certa dimensione.

#TODO: filter out ids from group_ids which correspond to groups with sizes < 3 
+0

questa è la sfida di accesso dei dipendenti Amazon di Kaggle, right =)) – herrfz

+0

Sì, è vero. È un piccolo mondo, Eriza, non è vero? ;) – piokuc

risposta

16

Un modo è quello di utilizzare il metodo size del groupby:

g = data.groupby(...) 
size = g.size() 
size[size > 3] 

Ad esempio, qui non c'è solo un gruppo di dimensione> 1:

In [11]: df = pd.DataFrame([[1, 2], [3, 4], [1,6]], columns=['A', 'B']) 

In [12]: df 
Out[12]: 
    A B 
0 1 2 
1 3 4 
2 1 6 

In [13]: g = df.groupby('A') 

In [14]: size = g.size() 

In [15]: size[size > 1] 
Out[15]: 
A 
1 2 
dtype: int64 

Se tu fossi interessato a limitare il DataFrame a quelli di grandi gruppi è possibile utilizzare il metodo filter:

In [21]: g.filter(lambda x: len(x) > 1) 
Out[21]: 
    A B 
0 1 2 
2 1 6 
+0

Grazie per questo. Ho provato 'g.filter (lambda x: len (x)> 1)' ma non ha funzionato per me, ho ottenuto un'eccezione. Ora sto cercando 'g.filter (g.size()> = threshold)'. Non è fallito immediatamente, il che è un buon segno, ma è lento ... L'ho iniziato ~ 10 minuti fa ed è ancora in esecuzione ... Ho ~ 90000 gruppi (senza il filtro). – piokuc

+0

@piokuc filter richiede 0.12 (non pensare 'g.filter (g.size()> = threshold)' fa quello che pensi che faccia ...: s) –

+0

Grazie mille Andy. Sì, non credo che 'g.filter (g.size()> = threshold)' fa quello che voglio, perché ci vuole solo troppo tempo (è ancora in esecuzione ... è necessario ucciderlo). Ho bisogno di controllare la versione dei panda che sto usando ... – piokuc