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
62
demandé sur jezrael 2016-07-11 17:38:25

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.

88
répondu jezrael 2018-08-09 12:29:37

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
89
répondu Psidom 2017-08-25 01:45:20

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
8
répondu ysearka 2016-07-11 14:50:17

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
8
répondu kamran kausar 2018-07-13 08:54:21