Tengo un dataframe y me gustaría saber cuántas veces una columna dada tiene el valor más frecuente.
Intento hacerlo de la siguiente manera:
items_counts = df['item'].value_counts() max_item = items_counts.max()
Como resultado obtengo:
ValueError: cannot convert float NaN to integer
Por lo que entiendo, con la primera línea obtengo series en las que los valores de una columna se utilizan como clave y la frecuencia de estos valores se utiliza como valores. Entonces, solo necesito encontrar el mayor valor en la serie y, por alguna razón, no funciona. ¿Alguien sabe cómo se puede resolver este problema?
Parece que puedes tener algunos nulos en la columna. Puede soltarlos con df = df.dropna(subset=['item'])
. Entonces df['item'].value_counts().max()
debe darle los conteos máximos, y df['item'].value_counts().idxmax()
debe darle el valor más frecuente.
También puede considerar el uso de la función de mode
scipy que ignora NaN. Una solución al usarlo podría verse como:
from scipy.stats import mode from numpy import nan df = DataFrame({"a": [1,2,2,4,2], "b": [nan, nan, nan, 3, 3]}) print mode(df)
La salida se vería como
(array([[ 2., 3.]]), array([[ 3., 2.]]))
lo que significa que los valores más comunes son 2
para las primeras columnas y 3
para la segunda, con frecuencias 3
y 2
respectivamente.
Para continuar con la respuesta de @jonathanrocher, puede usar el mode
en pandas DataFrame. Proporcionará los valores más frecuentes (uno o dos) en las filas o columnas:
import pandas as pd import numpy as np df = pd.DataFrame({"a": [1,2,2,4,2], "b": [np.nan, np.nan, np.nan, 3, 3]}) In [2]: df.mode() Out[2]: ab 0 2 3.0
Simplemente tome la primera fila de su serie items_counts
:
top = items_counts.head(1) # or items_counts.iloc[[0]] value, count = top.index[0], top.iat[0]
Esto funciona porque pd.Series.value_counts
tiene sort=True
de forma predeterminada y, por lo tanto, ya está ordenado por conteos, el conteo más alto primero. La extracción de un valor de un índice por ubicación tiene una complejidad O (1), mientras que pd.Series.idxmax
tiene una pd.Series.idxmax
O ( n ) donde n es el número de categorías.
Especificar sort=False
todavía es posible y luego se recomienda idxmax
:
items_counts = df['item'].value_counts(sort=False) top = items_counts.loc[[items_counts.idxmax()]] value, count = top.index[0], top.iat[0]
Tenga en cuenta que en este caso no necesita llamar a max
e idxmax
separado, simplemente extraiga el índice a través de idxmax
y alimente al indexador basado en tags loc
.