web-dev-qa-db-fra.com

Nombre de pandas (distinct) équivalent

J'utilise des pandas comme substitut de base de données car j'ai plusieurs bases de données (Oracle, mssql, etc.) et je ne parviens pas à créer une séquence de commandes avec un équivalent SQL.

J'ai une table chargée dans un DataFrame avec quelques colonnes:

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

En SQL, compter le nombre de clients différents par an serait:

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

Et le résultat serait 

201301    5000
201302    13245

Comment puis-je faire cela dans les pandas? 

176
Adriano Almeida

Je crois que c'est ce que tu veux:

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

Exemple:

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
285
Dan Allan

Voici une autre méthode, très simple, supposons que votre nom de cadre de données soit daat et que le nom de colonne est YEARMONTH.

daat.YEARMONTH.value_counts()
52
Enthusiast

Chose intéressante, très souvent, len(unique()) est quelques fois plus rapide (3x-15x) que nunique().

35
Roman Kh

Peut-être cela correspond le mieux à votre demande.

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

et GROUPBY comptent comme

print(YEARMONTH.groupby('CLIENTCODE').size())
0
N. Puri

En utilisant crosstab, cela retournera plus d'informations que groupbynunique 

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

Après un peu de modification, donne le résultat 

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

J'utilise aussi nunique mais cela sera très utile si vous devez utiliser une fonction d'agrégation telle que '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
0
Gangaraju