Ich verwende Pandas als Ersatz für Datenbanken, da ich mehrere Datenbanken (Oracle, Mssql usw.) habe und ich keine Befehlsfolge für ein SQL-Äquivalent erstellen kann.
Ich habe eine Tabelle mit einigen Spalten in einen DataFrame geladen:
YEARMONTH, CLIENTCODE, SIZE, .... etc etc
In SQL wäre die Anzahl der verschiedenen Clients pro Jahr zu zählen:
SELECT count(distinct CLIENTCODE) FROM table GROUP BY YEARMONTH;
Und das Ergebnis wäre
201301 5000
201302 13245
Wie kann ich das in Pandas machen?
Ich glaube, das ist, was Sie wollen:
table.groupby('YEARMONTH').CLIENTCODE.nunique()
Beispiel:
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
Hier ist eine andere, sehr einfache Methode. Nehmen wir an, der Name Ihres Datenrahmens ist daat
und der Name der Spalte ist YEARMONTH
.
daat.YEARMONTH.value_counts()
Interessanterweise ist len(unique())
oft einige Male (3x-15x) schneller als nunique()
.
Möglicherweise passt dies am besten zu Ihrer Anfrage.
print(YEARMONTH['CLIENTCODE'].unique())
und GROUPBY zählen als
print(YEARMONTH.groupby('CLIENTCODE').size())
Mit crosstab
werden mehr Informationen als groupby
nunique
zurückgegeben.
pd.crosstab(df.YEARMONTH,df.CLIENTCODE)
Out[196]:
CLIENTCODE 1 2 3
YEARMONTH
201301 2 1 0
201302 1 2 1
Nach ein wenig Änderung das Ergebnis liefern
pd.crosstab(df.YEARMONTH,df.CLIENTCODE).ne(0).sum(1)
Out[197]:
YEARMONTH
201301 2
201302 3
dtype: int64
Ich verwende auch nunique
, aber es ist sehr hilfreich, wenn Sie eine Aggregatfunktion wie 'min', 'max', 'count' or 'mean'
usw. verwenden müssen.
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