Cuando se usa "df [" category "]. Value_counts ()" dice que es un int? pero devuelve el nombre de la columna como índice? ¿Es un objeto de marco de datos o de alguna manera combina una serie (los recuentos) y los valores de columna únicos originales?
yoshiserry
@yoshiserry es una serie de Pandas type(df['category'].value_counts())y lo dirá
EdChum el
Lo hice, y eso me sorprendió, pero tiene sentido cuanto más lo pienso. Después de hacer esto, el valor cuenta en algunas columnas, hay filas que me gustaría excluir. Sé cómo eliminar columnas, pero ¿cómo excluyo filas?
yoshiserry
Respuestas:
414
Uso groupbyy count:
In[37]:
df = pd.DataFrame({'a':list('abssbab')})
df.groupby('a').count()Out[37]:
a
a
a 2
b 3
s 2[3 rows x 1 columns]
@yoshiserry No, lo que ve es que crea una serie que se alinea con el marco de datos original, a diferencia de los otros métodos que muestran los valores únicos y su frecuencia, si solo desea agregar el recuento de frecuencia al marco de datos, puede usar transform para esta. Es solo otra técnica, observa que no ha colapsado el marco de datos después de asignar de nuevo y no faltan valores. También creo que los Dataframes siempre tienen un índice, no creo que pueda deshacerse de él, solo restablecerlo, asignar uno nuevo o usar una columna como índice
EdChum
44
En su primer ejemplo de código, df se asigna como se esperaba, pero esta línea: df.groupby ('a'). Count () devuelve un marco de datos vacío. ¿Es posible que esta respuesta esté desactualizada con pandas 0.18.1? Además, es un poco confuso que el nombre de su columna 'a' sea el mismo que el valor que está buscando 'a'. Lo editaría yo mismo pero como el código no funciona para mí, no puedo estar seguro de mis ediciones.
Alex
1
@Alex, tienes razón, parece que en las últimas versiones esto ya no funciona, me parece un error ya que no veo por qué no
EdChum
1
¿Por qué no usar en df.['a'].value_counts().reset_index()lugar de df.groupby('a')['a'].transform('count')?
Tándem
1
@tandem, hacen diferentes cosas, las llamadas value_countsgenerarán un recuento de frecuencia, si desea agregar el resultado como una nueva columna contra su df original, entonces tendría que usarlo transformcomo se detalla en mi respuesta.
EdChum
93
Si desea aplicar a todas las columnas, puede usar:
df.apply(pd.value_counts)
Esto aplicará una función de agregación basada en columnas (en este caso value_counts) a cada una de las columnas.
Esta es la respuesta más simple. Esto debería estar en la parte superior.
Jeffrey Jose
44
Esta respuesta es simple pero (creo) que la applyoperación no aprovecha las ventajas que las matrices vectorizadas de Numpy proporcionan como columnas. Como resultado, el rendimiento podría ser un problema en conjuntos de datos más grandes.
kuanb
58
df.category.value_counts()
Esta pequeña línea de código le dará el resultado que desea.
Si el nombre de su columna tiene espacios que puede usar
Esto le dará una buena tabla de recuento de valores y un poco más :):
client hotel currency ota user_country
count 852845852845852845852845852845
unique 25541747713214219
top 219813202 USD Hades US
freq 1025628847516500242734340992
@metatoaster ya lo ha señalado. Ir por Counter. Está ardiendo rápido.
import pandas as pd
from collections importCounterimport timeit
import numpy as np
df = pd.DataFrame(np.random.randint(1,10000,(100,2)), columns=["NumA","NumB"])
Temporizadores
%timeit -n 10000 df['NumA'].value_counts()# 10000 loops, best of 3: 715 µs per loop%timeit -n 10000 df['NumA'].value_counts().to_dict()# 10000 loops, best of 3: 796 µs per loop%timeit -n 10000Counter(df['NumA'])# 10000 loops, best of 3: 74 µs per loop%timeit -n 10000 df.groupby(['NumA']).count()# 10000 loops, best of 3: 1.29 ms per loop
collections.Counter
df["category"].value_counts()
?type(df['category'].value_counts())
y lo diráRespuestas:
Uso
groupby
ycount
:Consulte los documentos en línea: http://pandas.pydata.org/pandas-docs/stable/groupby.html
También,
value_counts()
como ha comentado @DSM, muchas formas de desollar un gato aquíSi desea volver a agregar la frecuencia al marco de datos original, use
transform
para devolver un índice alineado:fuente
df.['a'].value_counts().reset_index()
lugar dedf.groupby('a')['a'].transform('count')
?value_counts
generarán un recuento de frecuencia, si desea agregar el resultado como una nueva columna contra su df original, entonces tendría que usarlotransform
como se detalla en mi respuesta.Si desea aplicar a todas las columnas, puede usar:
Esto aplicará una función de agregación basada en columnas (en este caso value_counts) a cada una de las columnas.
fuente
apply
operación no aprovecha las ventajas que las matrices vectorizadas de Numpy proporcionan como columnas. Como resultado, el rendimiento podría ser un problema en conjuntos de datos más grandes.Esta pequeña línea de código le dará el resultado que desea.
Si el nombre de su columna tiene espacios que puede usar
fuente
df['category 1'].value_counts()
value_counts : devuelve el objeto que contiene recuentos de valores únicos
aplicar - cuenta la frecuencia en cada columna. Si configura
axis=1
, obtiene frecuencia en cada filafillna (0): hace que la salida sea más elegante. Cambió NaN a 0
fuente
En 0.18.1
groupby
junto concount
no da la frecuencia de valores únicos:Sin embargo, los valores únicos y sus frecuencias se determinan fácilmente usando
size
:Con los
df.a.value_counts()
valores ordenados (en orden descendente, es decir, el valor más grande primero) se devuelven de forma predeterminada.fuente
Usando la comprensión de la lista y value_counts para múltiples columnas en un df
https://stackoverflow.com/a/28192263/786326
fuente
Si su DataFrame tiene valores con el mismo tipo, también puede establecerlo
return_counts=True
en numpy.unique () .index, counts = np.unique(df.values,return_counts=True)
np.bincount () podría ser más rápido si sus valores son enteros.
fuente
Sin ninguna biblioteca, puede hacer esto en su lugar:
Ejemplo:
fuente
También puede hacer esto con pandas transmitiendo primero sus columnas como categorías, por
dtype="category"
ejemplo , p. Ej.y luego llamando
describe
:Esto le dará una buena tabla de recuento de valores y un poco más :):
fuente
Primer recuento de valor único
Segundo recuento de valor único
Salida:
Salida:
fuente
@metatoaster ya lo ha señalado. Ir por
Counter
. Está ardiendo rápido.Temporizadores
¡Salud!
fuente
Usa este código:
fuente
solución:
fuente
Creo que esto debería funcionar bien para cualquier lista de columnas de DataFrame.
La función "column_list" verifica los nombres de las columnas y luego verifica la unicidad de los valores de cada columna.
fuente