Los Pandas count(distinct) equivalente

Estoy usando pandas como un db sustituto como tengo varias bases de datos (oracle, mssql, etc) y soy incapaz de hacer una secuencia de comandos de SQL equivalente.

Tengo una tabla cargada en un DataFrame con algunas columnas:

YEARMONTH, CLIENTCODE, SIZE, .... etc etc

En SQL, para contar la cantidad de clientes diferentes por año sería de:

SELECT count(distinct CLIENTCODE) FROM table GROUP BY YEARMONTH;

Y el resultado sería

201301    5000
201302    13245

¿Cómo puedo hacer que en los pandas?

  • He hecho la tabla.groupby([‘YEARMONTH’])[‘CLIENTCODE’].único() y vino con dos series indexados por YEARMONTH y con todos los valores únicos. Cómo contar la cantidad de valores en cada serie?
  • Para algunos, value_counts podría ser la respuesta que estás buscando: pandas.pydata.org/pandas-docs/stable/generated/…

6 Kommentare

  1. 376

    Creo que esto es lo que usted desea:

    table.groupby('YEARMONTH').CLIENTCODE.nunique()

    Ejemplo:

    In [2]: table
    Out[2]: 
       CLIENTCODE  YEARMONTH
    0           1     201301
    1           1     201301
    2           2     201301
    3           1     201302
    4           2     201302
    5           2     201302
    6           3     201302
    
    In [3]: table.groupby('YEARMONTH').CLIENTCODE.nunique()
    Out[3]: 
    YEARMONTH
    201301       2
    201302       3
    • Lo que si tengo varias columnas que quiero ser único, como en .drop_duplicates(subconjunto=[‘col1′,’col2’])?
    • Cómo acceder a este recuento único . Como no hay ningún nombre de columna
    • Muchas gracias, he utilizado este estilo en la salida de volver a muestrear. df_watch_record.volver a muestrear(‘M’).usuario.nunique() cuenta el número de usuarios únicos que han visto la película por mes.
    • y ordenarlos con la tabla.groupby(‘YEARMONTH’).CLIENTCODE.nunique().sort_values(ascendente=False)
    • Es posible recuperar el identificador de grupo después de nunique? Que lo intentara no puedo encontrar una manera, ya que el resultado de esta respuesta es un Series, no DataFrame.
    • Es posible aplicar esta para varias columnas? Ahora, en el ejemplo, sólo hay una columna seleccionada.

  2. 74

    Aquí hay otro método, mucho más simple, digamos que su dataframe nombre es daat y el nombre de la columna es YEARMONTH

    daat.YEARMONTH.value_counts()
    • Me gusta esta respuesta. ¿Cómo puedo usar este método si mi nombre de columna tiene un». » en él (por ejemplo, ‘ck.Class’)? Gracias
    • daat[‘ck.Class’].value_counts()
    • Esto no abordar la pregunta.
    • esta contando el número de observaciones dentro de cada grupo, no es el único valor de una determinada columna de cada grupo.
    • Esta es la respuesta incorrecta; no reflejan la DISTINCT requisito de la cuestión! Además, no incluye recuentos de NaN!
  3. 41

    Curiosamente, muy a menudo len(unique()) es un par de veces (3x-15) más rápido que nunique().

    • Te refieres a esto? .CLIENTCODE.apply(lambda x: len(x.unique())), de aquí
    • tendrías que colocarlo en un apply llamada con un lambda. Por ejemplo, df.groupby('YEARMONTH')['CLIENTCODE'].apply(lambda x: x.unique().shape[0]).
    • La sintaxis no está totalmente claro, he usado len(df['column'].unique()) no hay necesidad para la función lambda
    • Tengo TypeError: object of type 'method' has no len() de Chen's comentario, 3novak's trabajó para mí.
  4. 2

    Utilizando crosstab, este volverá más información de la que groupby nunique

    pd.crosstab(df.YEARMONTH,df.CLIENTCODE)
    Out[196]: 
    CLIENTCODE  1  2  3
    YEARMONTH          
    201301      2  1  0
    201302      1  2  1

    Después de un poco de modificar ,ceder el resultado

    pd.crosstab(df.YEARMONTH,df.CLIENTCODE).ne(0).sum(1)
    Out[197]: 
    YEARMONTH
    201301    2
    201302    3
    dtype: int64
  5. 1

    También estoy usando nunique pero va a ser muy útil si usted tiene que utilizar una función de agregado, como 'min', 'max', 'count' or 'mean' etc.

    df.groupby('YEARMONTH')['CLIENTCODE'].transform('nunique') #count(distinct)
    df.groupby('YEARMONTH')['CLIENTCODE'].transform('min')     #min
    df.groupby('YEARMONTH')['CLIENTCODE'].transform('max')     #max
    df.groupby('YEARMONTH')['CLIENTCODE'].transform('mean')    #average
    df.groupby('YEARMONTH')['CLIENTCODE'].transform('count')   #count
  6. 0

    Con nuevos pandas versión, es fácil de obtener como dataframe

    unique_count = pd.groupby(['YEARMONTH'], as_index=False).agg(uniq_CLIENTCODE =('CLIENTCODE',pd.Series.count))

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea