jaki jest najbardziej skuteczny sposób liczenia wystąpień w pandach?

131

Mam dużą (około 12 mln wierszy) df ramki danych z powiedzmy:

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

Tak więc następujące działania przebiegały w odpowiednim czasie:

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

Jednak to trwa nieoczekiwanie długo:

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

Co ja tu robię źle? Czy istnieje lepszy sposób zliczania wystąpień w dużej ramce danych?

df.word.describe()

działał całkiem nieźle, więc naprawdę nie spodziewałem się, że ta ramka danych Occurrences_of_Words potrwa bardzo długo.

ps: Jeśli odpowiedź jest oczywista i czujesz potrzebę ukarania mnie za zadanie tego pytania, dołącz również odpowiedź. Dziękuję Ci.

tipanverella
źródło

Odpowiedzi:

235

Myślę, że df['word'].value_counts()powinienem służyć. Pomijając maszynerię grupowania, zaoszczędzisz trochę czasu. Nie jestem pewien, dlaczego countpowinien być znacznie wolniejszy niż max. W obu przypadkach potrzeba trochę czasu, aby uniknąć brakujących wartości. (Porównaj z size.)

W każdym razie value_counts zostało specjalnie zoptymalizowane do obsługi typów obiektów, takich jak twoje słowa, więc wątpię, czy zrobisz coś znacznie lepszego.

Dan Allan
źródło
25
Dzięki. Zauważyłem również, że jest to przydatne do przyspieszenia zliczania określonej wartości w serii. np. df.word.value_counts()['myword']jest około dwa razy szybszy niż len(df[df.word == 'myword']).
fantabolous
A co z liczeniem całej ramki DataFrame? Działa to dla jednej kolumny.
Vaidøtas I.
2
Aby odpowiedzieć na moje własne pytanie (rozgryzłem to): .stack () function
Vaidøtas I.
@ Vaidøtas Ivøška, walczyłem, jak go używać. Czy mógłbyś podać przykład? A co, jeśli „słowa kluczowego” nie ma w kolumnie? Następnie wywołuje KeyError.
Newbielp
2
@Newbielp, zrobiłem to: df [[i for i in column_names]]. Astype ('str'). Stack (). Value_counts (). Sum (), co oznacza ustawienie każdej wybranej kolumny na typ str, układanie wszystkich osobno kolumny na górze, tworząc w zasadzie jedną kolumnę, a następnie wykonując value_counts () i sum () w tej jednej kolumnie. :) Stos jest całkiem przydatny, może nie jest to najbardziej oczywisty wybór, ale działał jak urok w moim przypadku :)
Vaidøtas I.
19

Jeśli chcesz policzyć częstotliwość danych kategorycznych w kolumnie w pandas dataFrame use: df['Column_Name'].value_counts()

- Źródło .

Dwaraka Uttarkar
źródło
11

To tylko dodatek do poprzednich odpowiedzi. Nie zapominajmy, że w przypadku rzeczywistych danych mogą występować wartości null, więc warto je również uwzględnić w zliczaniu za pomocą opcji dropna=False( domyślnieTrue )

Przykład:

>>> df['Embarked'].value_counts(dropna=False)
S      644
C      168
Q       77
NaN      2
user2314737
źródło