J'ai besoin de compter des valeurs _ ID
uniques 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
Vous avez besoin de 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 comme Jon Clements 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()
renvoie une série et agg()
renvoie un DataFrame.
Généralement, pour compter des valeurs distinctes dans une seule colonne, 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 le nombre 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
renvoie un _numpy.array
_ while _drop_duplicates
_ renvoie un _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
_
En ce qui concerne ce problème spécifique, puisque vous voudriez compter une valeur distincte par rapport à une autre variable, outre la méthode groupby
fournie par d’autres réponses ici, vous pouvez également tout simplement supprimer les doublons d’abord, 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
_
df.domain.value_counts ()
>>> df.domain.value_counts()
vk.com 5
Twitter.com 2
google.com 1
facebook.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 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