Lorsque vous utilisez "df [" category "]. Value_counts ()", il dit que c'est un int? mais il renvoie le nom de la colonne comme index? S'agit-il d'un objet de trame de données ou combine-t-il d'une manière ou d'une autre une série (les nombres) et les valeurs de colonne uniques d'origine?
yoshiserry
@yoshiserry c'est une série Pandas type(df['category'].value_counts())et ça le dira
EdChum
Je l'ai fait, et j'ai été surpris par cela, mais cela a du sens plus j'y pense. Après cela, la valeur compte sur certaines colonnes, il y a des lignes que j'aimerais exclure. Je sais comment supprimer des colonnes, mais comment exclure des lignes?
yoshiserry
Réponses:
414
Utiliser groupbyet 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]
@yoshiserry Non, ce que vous voyez, c'est qu'il crée une série qui s'aligne avec la trame de données d'origine, contrairement aux autres méthodes qui affichent les valeurs uniques et leur fréquence, si vous vouliez simplement ajouter un décompte de fréquence à la trame de données, vous pouvez utiliser la transformation pour ce. C'est juste une autre technique, vous remarquez qu'il n'a pas réduit la trame de données après l'affectation et qu'il n'y a pas de valeurs manquantes. Je pense aussi que les Dataframes ont toujours un index, je ne pense pas que vous puissiez vous en débarrasser, le réinitialiser uniquement, en affecter un nouveau ou utiliser une colonne comme index
EdChum
4
Dans votre premier exemple de code, df est affecté comme prévu, mais cette ligne: df.groupby ('a'). Count () renvoie une trame de données vide. Est-il possible que cette réponse soit obsolète avec les pandas 0.18.1? En outre, il est un peu déroutant que le nom de votre colonne «a» soit le même que la valeur que vous recherchez «a». Je le modifierais moi-même, mais comme le code ne fonctionne pas pour moi, je ne peux pas être sûr de mes modifications.
Alex
1
@Alex tu as raison, il semble que dans les dernières versions cela ne fonctionne plus, cela me semble être un bug car je ne vois pas pourquoi
EdChum
1
Pourquoi ne pas utiliser à la df.['a'].value_counts().reset_index()place de df.groupby('a')['a'].transform('count')?
tandem
1
@tandem, ils font des choses différentes, appeler value_countsgénérera un décompte de fréquences, si vous vouliez ajouter le résultat en tant que nouvelle colonne par rapport à votre df d'origine, vous devrez utiliser transformcomme détaillé dans ma réponse.
EdChum
93
Si vous souhaitez appliquer à toutes les colonnes, vous pouvez utiliser:
df.apply(pd.value_counts)
Cela appliquera une fonction d'agrégation basée sur les colonnes (dans ce cas value_counts) à chacune des colonnes.
C'est la réponse la plus simple. Cela devrait être au sommet.
Jeffrey Jose
4
Cette réponse est simple mais (je crois) l' applyopération ne tire pas parti des avantages offerts par les tableaux vectorisés Numpy sous forme de colonnes. Par conséquent, les performances pourraient être un problème sur des ensembles de données plus volumineux.
kuanb
58
df.category.value_counts()
Cette petite ligne de code courte vous donnera la sortie que vous souhaitez.
Si le nom de votre colonne contient des espaces, vous pouvez utiliser
Cela vous donnera un joli tableau des nombres de valeurs et un peu plus :):
client hotel currency ota user_country
count 852845852845852845852845852845
unique 25541747713214219
top 219813202 USD Hades US
freq 1025628847516500242734340992
@metatoaster l'a déjà souligné. Allez-y Counter. C'est extrêmement rapide.
import pandas as pd
from collections importCounterimport 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 10000Counter(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
collections.Counter
df["category"].value_counts()
?type(df['category'].value_counts())
et ça le diraRéponses:
Utiliser
groupby
etcount
:Voir les documents en ligne: http://pandas.pydata.org/pandas-docs/stable/groupby.html
Aussi,
value_counts()
comme l'a commenté @DSM, de nombreuses façons de dépecer un chat iciSi vous souhaitez ajouter de la fréquence à la trame de données d'origine, utilisez
transform
pour renvoyer un index aligné:la source
df.['a'].value_counts().reset_index()
place dedf.groupby('a')['a'].transform('count')
?value_counts
générera un décompte de fréquences, si vous vouliez ajouter le résultat en tant que nouvelle colonne par rapport à votre df d'origine, vous devrez utilisertransform
comme détaillé dans ma réponse.Si vous souhaitez appliquer à toutes les colonnes, vous pouvez utiliser:
Cela appliquera une fonction d'agrégation basée sur les colonnes (dans ce cas value_counts) à chacune des colonnes.
la source
apply
opération ne tire pas parti des avantages offerts par les tableaux vectorisés Numpy sous forme de colonnes. Par conséquent, les performances pourraient être un problème sur des ensembles de données plus volumineux.Cette petite ligne de code courte vous donnera la sortie que vous souhaitez.
Si le nom de votre colonne contient des espaces, vous pouvez utiliser
la source
df['category 1'].value_counts()
value_counts - Retourne un objet contenant des nombres de valeurs uniques
appliquer - compter la fréquence dans chaque colonne. Si vous définissez
axis=1
, vous obtenez la fréquence dans chaque lignefillna (0) - rendre la sortie plus sophistiquée. Changé NaN à 0
la source
En 0.18.1
groupby
aveccount
ne donne pas la fréquence des valeurs uniques:Cependant, les valeurs uniques et leurs fréquences sont facilement déterminées en utilisant
size
:Avec les
df.a.value_counts()
valeurs triées (par ordre décroissant, c'est-à-dire la plus grande valeur en premier), elles sont renvoyées par défaut.la source
Utilisation de la compréhension de liste et des value_counts pour plusieurs colonnes dans un df
https://stackoverflow.com/a/28192263/786326
la source
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.
la source
Sans aucune bibliothèque, vous pouvez le faire à la place:
Exemple:
la source
Vous pouvez également le faire avec des pandas en diffusant d'abord vos colonnes en catégories, par
dtype="category"
exemplepuis en appelant
describe
:Cela vous donnera un joli tableau des nombres de valeurs et un peu plus :):
la source
Premier décompte de valeur unique
Deuxième compte de valeur unique
Production:
Production:
la source
@metatoaster l'a déjà souligné. Allez-y
Counter
. C'est extrêmement rapide.Minuteries
À votre santé!
la source
Utilisez ce code:
la source
Solution:
la source
Je crois que cela devrait fonctionner correctement pour toute liste de colonnes DataFrame.
La fonction "liste_colonnes" vérifie les noms des colonnes, puis vérifie l'unicité des valeurs de chaque colonne.
la source