web-dev-qa-db-fra.com

Comment obtenir le numéro de la valeur la plus fréquente dans une colonne?

J'ai un bloc de données et je voudrais savoir combien de fois une colonne donnée a la valeur la plus fréquente.

J'essaie de le faire de la manière suivante:

items_counts = df['item'].value_counts()
max_item = items_counts.max()

En conséquence, je reçois:

ValueError: cannot convert float NaN to integer

Pour autant que je comprends, avec la première ligne, j'obtiens des séries dans lesquelles les valeurs d'une colonne sont utilisées comme clé et la fréquence de ces valeurs sont utilisées comme valeurs. Donc, j'ai juste besoin de trouver la plus grande valeur de la série et, pour une raison quelconque, cela ne fonctionne pas. Quelqu'un sait-il comment résoudre ce problème?

40
Roman

Il semble que vous ayez des valeurs NULL dans la colonne. Vous pouvez les déposer avec df = df.dropna(subset=['item']). Ensuite, df['item'].value_counts().max() devrait vous donner le nombre maximum, et df['item'].value_counts().idxmax() devrait vous donner la valeur la plus fréquente.

50
beardc

Pour continuer à répondre à @jonathanrocher, vous pouvez utiliser mode dans pandas DataFrame. Il donnera les valeurs les plus fréquentes (une ou deux) à travers le lignes ou colonnes:

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]: 
   a    b
0  2  3.0
12
Anton Protopopov

Vous pouvez également envisager d'utiliser la fonction mode de scipy qui ignore NaN. Une solution l'utilisant pourrait ressembler à:

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 sortie ressemblerait à

(array([[ 2.,  3.]]), array([[ 3.,  2.]]))

ce qui signifie que les valeurs les plus courantes sont 2 pour les premières colonnes et 3 pour le second, avec des fréquences 3 et 2 respectivement.

11
jonathanrocher

Ajoutez cette ligne de code pour trouver la valeur la plus fréquente

df["item"].value_counts().nlargest(n=1).values[0]
1
user9114146

Prenez simplement la première ligne de votre items_counts séries:

top = items_counts.head(1)  # or items_counts.iloc[[0]]
value, count = top.index[0], top.iat[0]

Cela fonctionne parce que pd.Series.value_counts a sort=True par défaut et est donc déjà ordonné par nombre, le nombre le plus élevé en premier. Extraire une valeur d'un index par emplacement a une complexité O(1), tandis que pd.Series.idxmax a une complexité O ( n ) où n est le nombre de catégories.

En précisant sort=False est toujours possible, puis idxmax est recommandé:

items_counts = df['item'].value_counts(sort=False)
top = items_counts.loc[[items_counts.idxmax()]]
value, count = top.index[0], top.iat[0]

Notez que dans ce cas, vous n'avez pas besoin d'appeler max et idxmax séparément, extrayez simplement l'index via idxmax et alimentez le loc en fonction de l'étiquette indexeur.

1
jpp