Cuenta de pandas (distinta) equivalente

Estoy usando pandas como sustituto de db ya que tengo varias bases de datos (oracle, mssql, etc.) y no puedo hacer una secuencia de comandos a un equivalente de SQL.

Tengo una tabla cargada en un DataFrame con algunas columnas:

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

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

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

Y el resultado sería

 201301 5000 201302 13245 

¿Cómo puedo hacer eso en los pandas?

Creo que esto es lo que quieres:

 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 

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

 daat.YEARMONTH.value_counts() 

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

Usando la crosstab de groupby crosstab , esto devolverá más información 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 modificar, ceder el resultado.

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

Tratar

 print(YEARMONTH['CLIENTCODE'].unique()) 

y GROUPBY cuentan como

 print(YEARMONTH.groupby('CLIENTCODE').size())