python - values - contar la frecuencia con la que se produce un valor en una columna de marco de datos
tabla de frecuencias en python (11)
En 0.18.1 groupby
junto con count
no da la frecuencia de valores únicos:
>>> df
a
0 a
1 b
2 s
3 s
4 b
5 a
6 b
>>> df.groupby(''a'').count()
Empty DataFrame
Columns: []
Index: [a, b, s]
Sin embargo, los valores únicos y sus frecuencias se determinan fácilmente usando el size
:
>>> df.groupby(''a'').size()
a
a 2
b 3
s 2
Con df.a.value_counts()
valores ordenados (en orden descendente, es decir, el valor más grande primero) se devuelven por defecto.
Tengo un conjunto de datos
|category|
cat a
cat b
cat a
Me gustaría poder devolver algo así como (mostrando valores únicos y frecuencia)
category | freq |
cat a 2
cat b 1
Esto debería funcionar:
df.groupby(''category'').size()
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.
Si su DataFrame tiene valores del mismo tipo, también puede establecer 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 tus valores son enteros.
Sin ninguna biblioteca, podrías hacer esto en su lugar:
def to_frequency_table(data):
frequencytable = {}
for key in data:
if key in frequencytable:
frequencytable[key] += 1
else:
frequencytable[key] = 1
return frequencytable
Ejemplo:
to_frequency_table([1,1,1,1,2,3,4,4])
>>> {1: 4, 2: 1, 3: 1, 4: 2}
También puede hacer esto con los pandas transmitiendo primero sus columnas como categorías, por ejemplo, dtype="category"
por ej.
cats = [''client'', ''hotel'', ''currency'', ''ota'', ''user_country'']
df[cats] = df[cats].astype(''category'')
y luego llamar describe
:
df[cats].describe()
Esto le dará una buena tabla de recuentos de valores y un poco más :):
client hotel currency ota user_country
count 852845 852845 852845 852845 852845
unique 2554 17477 132 14 219
top 2198 13202 USD Hades US
freq 102562 8847 516500 242734 340992
Usar groupby
y 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]
Consulte los documentos en línea: http://pandas.pydata.org/pandas-docs/stable/groupby.html
También value_counts()
como @DSM ha comentado, muchas maneras de despellejar a un gato aquí
In [38]:
df[''a''].value_counts()
Out[38]:
b 3
a 2
s 2
dtype: int64
Si desea volver a agregar la frecuencia al marco de datos original, use la transform
para devolver un índice alineado:
In [41]:
df[''freq''] = df.groupby(''a'')[''a''].transform(''count'')
df
Out[41]:
a freq
0 a 2
1 b 3
2 s 2
3 s 2
4 b 3
5 a 2
6 b 3
[7 rows x 2 columns]
Usar la lista de comprensión y la cantidad de valores para múltiples columnas en un df
[my_series[c].value_counts() for c in list(my_series.select_dtypes(include=[''O'']).columns)]
https://.com/a/28192263/786326
Use el método size ():
import pandas as pd
print df.groupby[''category''].size()
#where df is your dataframe
df.apply(pd.value_counts).fillna(0)
value_counts() - Devuelve un objeto que contiene recuentos de valores únicos
apply - frecuencia de conteo en cada columna. Si establece axis = 1, obtiene frequncy en cada fila
fillna (0) - hacer que la producción sea más elegante. Cambió NaN a 0
df.category.value_counts()
Esta pequeña línea de código le dará el resultado que desea.