¿Contando valores únicos en una columna en pandas dataframe como en Qlik?

100

Si tengo una mesa como esta:

df = pd.DataFrame({
         'hID': [101, 102, 103, 101, 102, 104, 105, 101],
         'dID': [10, 11, 12, 10, 11, 10, 12, 10],
         'uID': ['James', 'Henry', 'Abe', 'James', 'Henry', 'Brian', 'Claude', 'James'],
         'mID': ['A', 'B', 'A', 'B', 'A', 'A', 'A', 'C']
})

Puedo hacer count(distinct hID)en Qlik para llegar a un recuento de 5 para un HID único. ¿Cómo hago eso en Python usando un marco de datos de pandas? ¿O tal vez una matriz numpy? Del mismo modo, si tuviera que hacerlo count(hID), obtendría 8 en Qlik. ¿Cuál es la forma equivalente de hacerlo en pandas?

Delta de Alhpa
fuente
@piRSquared gracias. Podría hacer algo como df [['dID', 'hID']]. Agg (['count', 'size', 'nunique']) y funciona. Pero no funciona cuando se combina con groupby. Entonces df [['dID', 'hID']]. Groupby ('mID'). Agg (['count', 'size', 'nunique']) dice KeyError. ¿Hay alguna forma de seleccionar columnas particulares y aplicar una condición?
Alhpa Delta
Tres formas df[['mID', 'dID','hID']].groupby('mID').agg(['count', 'size', 'nunique'])
piRSquared
Odf[['dID','hID']].groupby(df['mID']).agg(['count', 'size', 'nunique'])
piRSquared
1
Odf.groupby('mID')[['dID', 'hID']].agg(['count', 'size', 'nunique'])
piRSquared

Respuestas:

180

Cuente valores distintos, use nunique:

df['hID'].nunique()
5

Cuente solo valores no nulos, use count:

df['hID'].count()
8

Cuente los valores totales, incluidos los valores nulos, use el sizeatributo:

df['hID'].size
8

Editar para agregar condición

Utilice la indexación booleana:

df.loc[df['mID']=='A','hID'].agg(['nunique','count','size'])

O usando query:

df.query('mID == "A"')['hID'].agg(['nunique','count','size'])

Salida:

nunique    5
count      5
size       5
Name: hID, dtype: int64
Scott Boston
fuente
¡Gracias! ¿Cómo agregamos una condición? ¿Como nunique para mID = 'A'?
Alhpa Delta
66

Si asumo que los datos son el nombre de su marco de datos, puede hacer:

data['race'].value_counts()

esto le mostrará el elemento distintivo y su número de ocurrencia.

oumar
fuente
Si desea las proporciones para cada artículo único, también puede hacerlo. data['race'].value_counts(normalize=True)
falso
24

O obtenga el número de valores únicos para cada columna:

df.nunique()

dID    3
hID    5
mID    3
uID    5
dtype: int64

Nuevo en pandas 0.20.0 pd.DataFrame.agg

df.agg(['count', 'size', 'nunique'])

         dID  hID  mID  uID
count      8    8    8    8
size       8    8    8    8
nunique    3    5    3    5

Siempre has sido capaz de hacer un agginside a groupby. Usé stackal final porque me gusta más la presentación.

df.groupby('mID').agg(['count', 'size', 'nunique']).stack()


             dID  hID  uID
mID                       
A   count      5    5    5
    size       5    5    5
    nunique    3    5    5
B   count      2    2    2
    size       2    2    2
    nunique    2    2    2
C   count      1    1    1
    size       1    1    1
    nunique    1    1    1
piRSquared
fuente
¡Gracias! ¿Cómo agregamos una condición? ¿Como nunique para mID = 'A'?
Alhpa Delta
@AlhpaDelta Agregué algo al final. Espero que ayude
piRSquared
2

Puedes usar nuniqueen pandas:

df.hID.nunique()
# 5
Psidom
fuente
0

Para contar valores únicos en la columna, digamos hIDdel marco de datos df, use:

len(df.hID.unique())
Uma Raj
fuente
-3

puede usar una propiedad única usando la función len

len (df ['HID']. único ()) 5

Manu Siddhartha
fuente