Cuente valores únicos por grupos con Pandas [duplicado]

Resuelto Arseniy Krupenin asked hace 8 años • 4 respuestas

Necesito contar IDvalores únicos en cada domain.

tengo datos:

 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

lo intentodf.groupby(['domain', 'ID']).count()

pero quiero conseguir

domain       count
vk.com        3
twitter.com   2
facebook.com  1
google.com    1
Arseniy Krupenin avatar Jul 11 '16 21:07 Arseniy Krupenin
Aceptado

Necesitas 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 necesitas personajes:strip '

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

O como comentó Jon Clements :

df.groupby(df.domain.str.strip("'"))['ID'].nunique()

Puede conservar el nombre de la columna de esta manera:

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 diferencia es que nunique()devuelve una Serie y agg()devuelve un DataFrame.

jezrael avatar Jul 11 '2016 14:07 jezrael

Generalmente, para contar valores distintos en una sola columna, puede usar Series.value_counts:

df.domain.value_counts()

#'vk.com'          5
#'twitter.com'     2
#'facebook.com'    1
#'google.com'      1
#Name: domain, dtype: int64

Para ver cuántos valores únicos hay en una columna, use Series.nunique:

df.domain.nunique()
# 4

Para obtener todos estos valores distintos, puede usar uniqueo drop_duplicates, la ligera diferencia entre las dos funciones es que uniquereturn a numpy.arraywhile drop_duplicatesdevuelve a 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 cuanto a este problema específico, dado que le gustaría contar un valor distinto con respecto a otra variable, además del groupbymétodo proporcionado por otras respuestas aquí, también puede simplemente eliminar duplicados primero y luego hacer 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
Psidom avatar Jul 11 '2016 14:07 Psidom