2015-04-27 17 views
8

Ho revisioni di testo in una colonna nel dataframe di Pandas e voglio contare le parole N-più frequenti con i loro conteggi di frequenza (in colonna intera - NON in singola cella). Un approccio è il conteggio delle parole utilizzando un contatore, eseguendo un iterazione attraverso ogni riga. C'è un'alternativa migliore?Conta più frequentemente 100 parole da frasi in Dataframe Panda

Dati rappresentativi.

0 a heartening tale of small victories and endu 
1 no sophomore slump for director sam mendes w 
2 if you are an actor who can relate to the sea 
3 it's this memory-as-identity obviation that g 
4 boyd's screenplay (co-written with guardian 
+2

In genere è utile pubblicare dati come tabella e non immagini. – Zero

+0

Grazie John per il suggerimento, ho provato a utilizzare html per creare un tavolo in questione, ma funziona a dovere, quindi ho pubblicato pigramente un'immagine :(. –

+1

I dati non devono essere sempre completi. – Zero

risposta

15
Counter(" ".join(df["text"]).split()).most_common(100) 

im abbastanza sicuro che darebbe ciò che si vuole (si potrebbe essere necessario rimuovere alcuni non-parole del risultato del contatore prima di chiamare most_common)

+1

Questo darebbe il conteggio dei caratteri e non il conteggio delle parole, potrebbe essere? – Zero

+0

whoops corretto: P chi è John Galt? –

+0

Bene, ancora a capire fuori me stesso;) +1 per l'eleganza lì! – Zero

14

Insieme con @ soluzione Joran si potrebbe anche utilizzare series.value_counts per grandi quantità di testo/righe

pd.Series(' '.join(df['text']).lower().split()).value_counts()[:100] 

Si potrebbe trovare dai parametri di riferimento series.value_counts sembra due volte (2X) più veloce diMetodo

Per set di dati Recensioni film di 3000 righe, per un totale di 400 K caratteri e 70 k parole.

In [448]: %timeit Counter(" ".join(df.text).lower().split()).most_common(100) 
10 loops, best of 3: 44.2 ms per loop 

In [449]: %timeit pd.Series(' '.join(df.text).lower().split()).value_counts()[:100] 
10 loops, best of 3: 27.1 ms per loop 
+0

Questo è un po 'stupefacente, uno (I) penserebbe che l'iterazione e l'aggiornamento di un contatore sarebbe più rapido rispetto alla manipolazione delle stringhe, per non parlare della creazione di una serie. Ma si scopre che l'aggiornamento piuttosto che la divisione è la parte lenta ... (e i panda usano cython/klib piuttosto che un semplice dict). –