Cuente valores únicos por grupos con Pandas [duplicado]
Necesito contar ID
valores ú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
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.
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 unique
o drop_duplicates
, la ligera diferencia entre las dos funciones es que unique
return a numpy.array
while drop_duplicates
devuelve 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 groupby
mé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