¿Cuál es la forma más eficiente de contar las ocurrencias en los pandas?

131

Tengo un gran marco de datos (aproximadamente 12 millones de filas) df con decir:

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

Entonces lo siguiente se ejecutó de manera oportuna:

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

Sin embargo, esto tarda un tiempo inesperado en ejecutarse:

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

¿Qué estoy haciendo mal aquí? ¿Hay una mejor manera de contar las ocurrencias en un gran marco de datos?

df.word.describe()

funcionó bastante bien, por lo que realmente no esperaba que este marco de datos Occurrences_of_Words tardara mucho en construirse.

PD: Si la respuesta es obvia y sientes la necesidad de penalizarme por hacer esta pregunta, incluye la respuesta también. gracias.

tipanverella
fuente

Respuestas:

235

Creo que df['word'].value_counts()debería servir. Al saltarse la maquinaria grupal, ahorrará algo de tiempo. No estoy seguro de por qué countdebería ser mucho más lento que max. Ambos toman un tiempo para evitar valores perdidos. (Comparar con size)

En cualquier caso, value_counts se ha optimizado específicamente para manejar el tipo de objeto, como sus palabras, por lo que dudo que lo haga mucho mejor que eso.

Dan Allan
fuente
25
Gracias. También encontré esto útil para acelerar el conteo de un valor específico en una serie. por ejemplo, df.word.value_counts()['myword']es aproximadamente el doble de rápido que len(df[df.word == 'myword']).
fantabolous
¿Qué hay de contar sobre todo el DataFrame? Esto funciona para una columna.
Vaidøtas I.
2
Para responder a mi propia pregunta (lo descubrí): función .stack ()
Vaidøtas I.
@ Vaidøtas Ivøška, he estado luchando por cómo usarlo. ¿Podrías dar un ejemplo? ¿Qué pasa si 'myword' no está en la columna? Luego levanta un KeyError.
Newbielp
2
@Newbielp, hice esto: df [[i para i en column_names]]. Astype ('str'). Stack (). Value_counts (). Sum () que equivale a configurar cada columna seleccionada para el tipo str, apilando todos los elementos individuales columnas en la parte superior, formando básicamente una columna y luego haciendo value_counts () y sum () en esa columna. :) Stack es bastante útil, puede que no sea la opción más obvia, pero funcionó de
maravilla
19

Cuando desee contar la frecuencia de datos categóricos en una columna en el uso de pandas dataFrame: df['Column_Name'].value_counts()

- Fuente .

Dwaraka Uttarkar
fuente
11

Solo una adición a las respuestas anteriores. No olvidemos que cuando se trata de datos reales puede haber valores nulos, por lo que es útil incluirlos también en el recuento utilizando la opción dropna=False(el valor predeterminado esTrue )

Un ejemplo:

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