каков самый эффективный способ подсчета вхождений в пандах?


131

У меня есть большой (около 12 миллионов строк) dataframe df, скажем:

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

Таким образом, своевременно выполнялось следующее:

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

Однако это занимает неожиданно много времени:

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

Что я здесь делаю не так? Есть ли лучший способ подсчета вхождений в большом фрейме данных?

df.word.describe()

работал довольно хорошо, поэтому я действительно не ожидал, что создание этого фрейма данных Occurrences_of_Words займет очень много времени.

ps: Если ответ очевиден и вы чувствуете необходимость наказать меня за этот вопрос, включите также ответ. Спасибо.

Ответы:


235

Думаю, df['word'].value_counts()должен служить. Отказавшись от группового оборудования, вы сэкономите время. Я не уверен, почему countдолжно быть намного медленнее max. И то, и другое требует времени, чтобы избежать пропуска значений. (Сравните с size.)

В любом случае value_counts был специально оптимизирован для обработки типа объекта, такого как ваши слова, поэтому я сомневаюсь, что вы справитесь намного лучше.


25
Спасибо. Я также нашел это полезным для ускорения подсчета определенного значения в серии. eg df.word.value_counts()['myword']примерно в два раза быстрее, чем len(df[df.word == 'myword']).
fantabolous

А как насчет подсчета всего DataFrame? Это работает для одного столбца.
Вайдётас I.

2
Чтобы ответить на мой собственный вопрос (разобрался): функция .stack ()
Вайдётас I.

@ Vaidøtas Ivøška, я долго боролся, как его использовать. Не могли бы вы привести пример? Что делать, если «мое слово» отсутствует в столбце? Затем он вызывает KeyError.
Newbielp

2
@Newbielp, я сделал это: df [[i for i in column_names]]. Astype ('str'). Stack (). Value_counts (). Sum (), который соответствует установке каждого выбранного столбца на тип str, складывая все отдельные столбцы вверху, формируя в основном один столбец, а затем выполняя value_counts () и sum () для этого одного столбца. :) Стек довольно полезен, возможно, это не самый очевидный выбор, но он
отлично подходит


11

Просто дополнение к предыдущим ответам. Не забывайте, что при работе с реальными данными могут быть нулевые значения, поэтому полезно также включить их в подсчет, используя параметр dropna=False(по умолчаниюTrue )

Пример:

>>> df['Embarked'].value_counts(dropna=False)
S      644
C      168
Q       77
NaN      2
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.