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?
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.
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
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.
Ajoutez cette ligne de code pour trouver la valeur la plus fréquente
df["item"].value_counts().nlargest(n=1).values[0]
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.