J'ai un jeu de données
|category|
cat a
cat b
cat a
J'aimerais pouvoir retourner quelque chose comme (montrant des valeurs et une fréquence uniques)
category | freq |
cat a 2
cat b 1
Utilisez groupby
et 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]
Voir les documents en ligne: http://pandas.pydata.org/pandas-docs/stable/groupby.html
Aussi value_counts()
comme @DSM l’a commenté, il existe de nombreuses façons de traiter un chat ici
In [38]:
df['a'].value_counts()
Out[38]:
b 3
a 2
s 2
dtype: int64
Si vous souhaitez rajouter une fréquence à la trame de données d'origine, utilisez transform
pour renvoyer un index aligné:
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]
Si vous souhaitez appliquer à toutes les colonnes, vous pouvez utiliser:
df.apply(pd.value_counts)
Ceci appliquera une fonction d'agrégation basée sur les colonnes (dans ce cas, value_counts) à chacune des colonnes.
df.category.value_counts()
Cette courte ligne de code vous donnera la sortie que vous voulez.
Si votre nom de colonne contient des espaces, vous pouvez utiliser
df['category'].value_counts()
df.apply(pd.value_counts).fillna(0)
value_counts - Retourne un objet contenant des nombres de valeurs uniques
applique - compte la fréquence dans chaque colonne. Si vous définissez axe = 1, vous obtenez une fréquence à chaque ligne
fillna (0) - rend la sortie plus élégante. NaN changé à 0
Dans 0.18.1, groupby
avec count
ne donne pas la fréquence des valeurs uniques:
>>> 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]
Cependant, les valeurs uniques et leurs fréquences sont facilement déterminées à l'aide de size
:
>>> df.groupby('a').size()
a
a 2
b 3
s 2
Avec df.a.value_counts()
, les valeurs triées (dans l’ordre décroissant, c’est-à-dire la plus grande valeur en premier) sont renvoyées par défaut.
Utilisation de la compréhension de liste et de value_counts pour plusieurs colonnes dans un fichier df
[my_series[c].value_counts() for c in list(my_series.select_dtypes(include=['O']).columns)]
Cela devrait fonctionner:
df.groupby('category').size()
Si votre DataFrame a des valeurs du même type, vous pouvez également définir return_counts=True
dans numpy.unique () .
index, counts = np.unique(df.values,return_counts=True)
np.bincount () pourrait être plus rapide si vos valeurs sont des entiers.
Utilisez la méthode size ():
import pandas as pd
print df.groupby['category'].size()
#where df is your dataframe
Sans aucune bibliothèque, vous pouvez le faire à la place:
def to_frequency_table(data):
frequencytable = {}
for key in data:
if key in frequencytable:
frequencytable[key] += 1
else:
frequencytable[key] = 1
return frequencytable
Exemple:
to_frequency_table([1,1,1,1,2,3,4,4])
>>> {1: 4, 2: 1, 3: 1, 4: 2}
Vous pouvez également le faire avec des pandas en diffusant d’abord vos colonnes sous forme de catégories, par exemple. dtype="category"
par exemple.
cats = ['client', 'hotel', 'currency', 'ota', 'user_country']
df[cats] = df[cats].astype('category')
puis en appelant describe
:
df[cats].describe()
Cela vous donnera une belle table des valeurs et un peu plus :):
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
df.category.value_counts () - C’est le moyen le plus simple de calculer
Je pense que cela devrait fonctionner correctement pour toutes les listes de colonnes DataFrame.
def column_list(x):
column_list_df = []
for col_name in x.columns:
y = col_name, len(x[col_name].unique())
column_list_df.append(y)
return pd.DataFrame(column_list_df)
column_list_df.rename(columns={0: "Feature", 1: "Value_count"})
La fonction "column_list" vérifie les noms des colonnes, puis vérifie l'unicité des valeurs de chaque colonne.
n_values = data.income.value_counts()
Premier compte de valeur unique
n_at_most_50k = n_values[0]
Deuxième compte de valeur unique
n_greater_50k = n_values[1]
n_values
Sortie:
<=50K 34014
>50K 11208
Name: income, dtype: int64
Sortie:
n_greater_50k,n_at_most_50k:-
(11208, 34014)
Utilisez ce code:
import numpy as np
np.unique(df['a'],return_counts=True)
@metatoaster a déjà signalé cela . Optez pour Counter
. Il flambe vite.
import pandas as pd
from collections import Counter
import timeit
import numpy as np
df = pd.DataFrame(np.random.randint(1, 10000, (100, 2)), columns=["NumA", "NumB"])
%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 10000 Counter(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
À votre santé!
your data:
|category|
cat a
cat b
cat a
solution:
df['freq'] = df.groupby('category')['category'].transform('count')
df = df.drop_duplicates()