quel est le moyen le plus efficace de compter les occurrences chez les pandas?

131

J'ai un grand (environ 12M lignes) dataframe df avec disons:

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

Ainsi, ce qui suit s'est déroulé en temps opportun:

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

Cependant, cela prend un temps inattendu à s'exécuter:

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

Qu'est-ce que je fais de mal ici? Existe-t-il une meilleure façon de compter les occurrences dans une grande trame de données?

df.word.describe()

a plutôt bien fonctionné, donc je ne m'attendais vraiment pas à ce que ce dataframe Occurrences_of_Words prenne beaucoup de temps à construire.

ps: Si la réponse est évidente et que vous ressentez le besoin de me pénaliser pour avoir posé cette question, veuillez également inclure la réponse. Merci.

tipanverella
la source

Réponses:

235

Je pense que df['word'].value_counts()devrait servir. En sautant les machines groupby, vous gagnerez du temps. Je ne sais pas pourquoi countdevrait être beaucoup plus lent que max. Les deux prennent un certain temps pour éviter les valeurs manquantes. (Comparez avec size.)

Dans tous les cas, value_counts a été spécifiquement optimisé pour gérer le type d'objet, comme vos mots, donc je doute que vous fassiez beaucoup mieux que cela.

Dan Allan
la source
25
Merci. J'ai également trouvé cela utile pour accélérer le comptage d'une valeur spécifique dans une série. par exemple df.word.value_counts()['myword']est environ deux fois plus rapide que len(df[df.word == 'myword']).
fantastique
Qu'en est-il du comptage sur l'ensemble du DataFrame? Cela fonctionne pour une colonne.
Vaidøtas I.
2
Pour répondre à ma propre question (j'ai compris): fonction .stack ()
Vaidøtas I.
@ Vaidøtas Ivøška, j'ai du mal à l'utiliser. Pouvez-vous donner un exemple? Et si «mon mot» ne figure pas dans la colonne? Il déclenche ensuite une KeyError.
Newbielp le
2
@Newbielp, j'ai fait ceci: df [[i for i in column_names]]. Astype ('str'). Stack (). Value_counts (). Sum () qui équivaut à définir chaque colonne sélectionnée sur le type str, en empilant tous les individus colonnes en haut, formant essentiellement une colonne, puis effectuant les valeurs value_counts () et sum () sur cette colonne. :) Stack est assez utile, ce n'est peut-être pas le choix le plus évident, mais a fonctionné comme un charme pour mon cas d'utilisation :)
Vaidøtas I.
19

Lorsque vous souhaitez compter la fréquence des données catégorielles dans une colonne de pandas dataFrame, utilisez: df['Column_Name'].value_counts()

- Source .

Dwaraka Uttarkar
la source
11

Juste un ajout aux réponses précédentes. N'oublions pas que lorsqu'il s'agit de données réelles, il peut y avoir des valeurs nulles, il est donc utile de les inclure également dans le comptage en utilisant l'option dropna=False(la valeur par défaut estTrue )

Un exemple:

>>> df['Embarked'].value_counts(dropna=False)
S      644
C      168
Q       77
NaN      2
utilisateur2314737
la source