Was ist die effizienteste Methode, um Vorkommen bei Pandas zu zählen?

131

Ich habe einen großen (ungefähr 12 Millionen Zeilen) Datenrahmen df mit sagen:

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

Folgendes lief also zeitnah ab:

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

Die Ausführung dauert jedoch unerwartet lange:

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

Was mache ich hier falsch? Gibt es eine bessere Möglichkeit, Vorkommen in einem großen Datenrahmen zu zählen?

df.word.describe()

lief ziemlich gut, daher hatte ich wirklich nicht erwartet, dass die Erstellung dieses Occurrences_of_Words-Datenrahmens sehr lange dauern würde.

ps: Wenn die Antwort offensichtlich ist und Sie das Bedürfnis haben, mich für das Stellen dieser Frage zu bestrafen, geben Sie bitte auch die Antwort an. Danke.

Tipanverella
quelle

Antworten:

235

Ich denke df['word'].value_counts()sollte dienen. Wenn Sie die Gruppenmaschinen überspringen, sparen Sie Zeit. Ich bin mir nicht sicher, warum countviel langsamer sein sollte als max. Beide brauchen einige Zeit, um fehlende Werte zu vermeiden. (Vergleiche mit size.)

In jedem Fall wurde value_counts speziell für den Umgang mit Objekttypen wie Ihren Worten optimiert. Ich bezweifle, dass Sie dies viel besser machen werden.

Dan Allan
quelle
25
Vielen Dank. Ich fand dies auch nützlich, um das Zählen eines bestimmten Werts in einer Reihe zu beschleunigen. zB df.word.value_counts()['myword']ist etwa doppelt so schnell wie len(df[df.word == 'myword']).
fantastisch
Was ist mit dem Zählen über den gesamten DataFrame? Dies funktioniert für eine Spalte.
Vaidøtas I.
2
Um meine eigene Frage zu beantworten (herausgefunden): .stack () -Funktion
Vaidøtas I.
@ Vaidøtas Ivøška, ich habe Probleme damit, es zu benutzen. Könnten Sie ein Beispiel geben? Was ist, wenn 'myword' nicht in der Spalte steht? Es wird dann ein KeyError ausgelöst.
Newbielp
2
@Newbielp, ich habe dies getan: df [[i für i in Spaltennamen]]. Astype ('str'). Stack (). Value_counts (). Sum (), was bedeutet, dass jede ausgewählte Spalte auf str-Typ gesetzt wird, wobei alle einzeln gestapelt werden Spalten oben, bilden im Grunde eine Spalte und führen dann die Werte_counts () und sum () für diese eine Spalte aus. :) Stack ist ziemlich nützlich, es ist vielleicht nicht die naheliegendste Wahl, aber es hat wie ein Zauber für meinen Anwendungsfall
funktioniert
19

Wenn Sie die Häufigkeit kategorialer Daten in einer Spalte in pandas dataFrame zählen möchten, verwenden Sie: df['Column_Name'].value_counts()

- Quelle .

Dwaraka Uttarkar
quelle
10

Nur eine Ergänzung zu den vorherigen Antworten. Vergessen wir nicht, dass es beim Umgang mit realen Daten möglicherweise Nullwerte gibt. Daher ist es hilfreich, diese auch mithilfe der Option in die Zählung einzubeziehen dropna=False( Standard istTrue ).

Ein Beispiel:

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