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?
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
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()
Chose intéressante, très souvent, len(unique())
est quelques fois plus rapide (3x-15x) que nunique()
.
Peut-être cela correspond le mieux à votre demande.
print(YEARMONTH['CLIENTCODE'].unique())
et GROUPBY comptent comme
print(YEARMONTH.groupby('CLIENTCODE').size())
En utilisant crosstab
, cela retournera plus d'informations que groupby
nunique
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
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