web-dev-qa-db-fra.com

compter la fréquence à laquelle une valeur apparaît dans une colonne dataframe

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
174
yoshiserry

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]
245
EdChum

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.

68
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()
26
Satyajit Dhawale
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

14
Roman Kazakov

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.

12
Vidhya G

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)]

https://stackoverflow.com/a/28192263/786326

5
jetpackdata.com

Cela devrait fonctionner:

df.groupby('category').size()
4
Kilzrus

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.

4
user666

Utilisez la méthode size ():

    import pandas as pd
    print df.groupby['category'].size()
    #where df is your dataframe
2
Omniverse10

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}
2
Timz95

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
1
tsando

df.category.value_counts () - C’est le moyen le plus simple de calculer 

0
R. J.

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.

0
djoguns
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)
0
RAHUL KUMAR

Utilisez ce code: 

import numpy as np
np.unique(df['a'],return_counts=True)
0
Harshit Oberoi

@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"])

Minuteries

%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é!

0
dragonfire_007
your data:

|category|
cat a
cat b
cat a

solution:

 df['freq'] = df.groupby('category')['category'].transform('count')
 df =  df.drop_duplicates()
0
Rahul Jain