qual è il modo più efficiente di contare le occorrenze nei panda?


131

Ho un grande datafame (circa 12 M righe) df con dire:

df.columns = ['word','documents','frequency']

Quindi quanto segue ha funzionato in modo tempestivo:

word_grouping = df[['word','frequency']].groupby('word')
MaxFrequency_perWord = word_grouping[['frequency']].max().reset_index()
MaxFrequency_perWord.columns = ['word','MaxFrequency']

Tuttavia, ciò richiede un tempo imprevisto per l'esecuzione:

Occurrences_of_Words = word_grouping[['word']].count().reset_index()

Cosa sto facendo di sbagliato qui? Esiste un modo migliore per contare le ricorrenze in un frame di dati di grandi dimensioni?

df.word.describe()

ha funzionato abbastanza bene, quindi non mi aspettavo davvero che questo frame di dati Occurrences_of_Words richiedesse molto tempo per essere costruito.

ps: se la risposta è ovvia e senti il ​​bisogno di penalizzarmi per aver posto questa domanda, includi anche la risposta. grazie.

Risposte:


235

Penso che df['word'].value_counts()dovrebbe servire. Saltando i macchinari del groupby, risparmierai un po 'di tempo. Non sono sicuro del motivo per cui countdovrebbe essere molto più lento di max. Entrambi richiedono del tempo per evitare valori mancanti. (Confronta con size.)

In ogni caso, value_counts è stato specificamente ottimizzato per gestire il tipo di oggetto, come le tue parole, quindi dubito che farai molto meglio di così.


25
Grazie. Ho anche trovato questo utile per accelerare il conteggio di un valore specifico in una serie. ad esempio df.word.value_counts()['myword']è circa due volte più veloce di len(df[df.word == 'myword']).
fantabolous

Che ne dici di contare sull'intero DataFrame? Questo funziona per una colonna.
Vaidøtas I.

2
Per rispondere alla mia domanda (capito): funzione .stack ()
Vaidøtas I.

@ Vaidøtas Ivøška, ho faticato a usarlo. Potresti fare un esempio? Cosa succede se "myword" non è nella colonna? Quindi genera un KeyError.
Newbielp,

2
@Newbielp, ho fatto questo: df [[i for i in column_names]]. Astype ('str'). Stack (). Value_counts (). Sum () che equivale a impostare ogni colonna selezionata sul tipo str, impilando tutti i singoli colonne in alto, formando sostanzialmente una colonna e quindi eseguendo value_counts () e sum () su quella colonna. :) Lo stack è piuttosto utile, potrebbe non essere la scelta più ovvia, ma ha funzionato come un incantesimo per il mio caso d'uso :)
Vaidøtas I.

19

Quando si desidera contare la frequenza dei dati categorici in una colonna in Panda Data, utilizzare Frame: df['Column_Name'].value_counts()

- Fonte .


11

Solo un'aggiunta alle risposte precedenti. Non dimentichiamo che quando si ha a che fare con dati reali potrebbero esserci valori nulli, quindi è utile includere anche quelli nel conteggio utilizzando l'opzione dropna=False( impostazione predefinita èTrue )

Un esempio:

>>> df['Embarked'].value_counts(dropna=False)
S      644
C      168
Q       77
NaN      2
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.