Compter les valeurs uniques avec pandas par groupe [dupliquer]
cette question a déjà une réponse ici:
- Pandas count(distinct) equivalent 3 réponses
je dois compter les valeurs uniques ID
dans chaque domain
J'ai des données
ID, domain
123, 'vk.com'
123, 'vk.com'
123, 'twitter.com'
456, 'vk.com'
456, 'facebook.com'
456, 'vk.com'
456, 'google.com'
789, 'twitter.com'
789, 'vk.com'
j'essaie df.groupby(['domain', 'ID']).count()
Mais je veux obtenir
domain, count
vk.com 3
twitter.com 2
facebook.com 1
google.com 1
4 réponses
vous avez besoin nunique
:
df = df.groupby('domain')['ID'].nunique()
print (df)
domain
'facebook.com' 1
'google.com' 1
'twitter.com' 2
'vk.com' 3
Name: ID, dtype: int64
si vous avez besoin de strip
'
caractères:
df = df.ID.groupby([df.domain.str.strip("'")]).nunique()
print (df)
domain
facebook.com 1
google.com 1
twitter.com 2
vk.com 3
Name: ID, dtype: int64
Ou Jon Clements
a commenté:
df.groupby(df.domain.str.strip("'"))['ID'].nunique()
vous pouvez conserver le nom de la colonne comme ceci:
df = df.groupby(by='domain', as_index=False).agg({'ID': pd.Series.nunique})
print(df)
domain ID
0 fb 1
1 ggl 1
2 twitter 2
3 vk 3
la différence est que nunique()
retourne une série et agg()
retourne un DataFrame.
généralement pour compter des valeurs distinctes dans une colonne simple, vous pouvez utiliser Series.value_counts
:
df.domain.value_counts()
#'vk.com' 5
#'twitter.com' 2
#'facebook.com' 1
#'google.com' 1
#Name: domain, dtype: int64
pour voir combien de valeurs uniques dans une colonne, utilisez Series.nunique
:
df.domain.nunique()
# 4
Pour obtenir toutes ces valeurs distinctes, vous pouvez utiliser unique
ou drop_duplicates
, la légère différence entre les deux fonctions est que unique
retour numpy.array
, alors que drop_duplicates
retourne pandas.Series
:
df.domain.unique()
# array(["'vk.com'", "'twitter.com'", "'facebook.com'", "'google.com'"], dtype=object)
df.domain.drop_duplicates()
#0 'vk.com'
#2 'twitter.com'
#4 'facebook.com'
#6 'google.com'
#Name: domain, dtype: object
quant à ce problème spécifique, puisque vous souhaitez compter valeur distincte par rapport à une autre variable, outre groupby
méthode fournie par d'autres réponses ici, vous pouvez aussi simplement laisser tomber les doublons d'abord et puis faire value_counts()
:
import pandas as pd
df.drop_duplicates().domain.value_counts()
# 'vk.com' 3
# 'twitter.com' 2
# 'facebook.com' 1
# 'google.com' 1
# Name: domain, dtype: int64
IIUC vous voulez le nombre de différents ID
pour chaque domain
, alors vous pouvez essayer ceci:
output = df.drop_duplicates()
output.groupby('domain').size()
sortie:
domain
facebook.com 1
google.com 1
twitter.com 2
vk.com 3
dtype: int64
vous pouvez également utiliser value_counts
, qui est légèrement moins efficace.Mais le meilleur est la réponse de Jezrael en utilisant nunique
:
%timeit df.drop_duplicates().groupby('domain').size()
1000 loops, best of 3: 939 µs per loop
%timeit df.drop_duplicates().domain.value_counts()
1000 loops, best of 3: 1.1 ms per loop
%timeit df.groupby('domain')['ID'].nunique()
1000 loops, best of 3: 440 µs per loop
df.domaine.comptes de la valeur () 151920920"
>>> df.domain.value_counts()
vk.com 5
twitter.com 2
google.com 1
facebook.com 1
Name: domain, dtype: int64