it-swarm.com.de

Pandas zählen (verschieden) gleich

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? 

176
Adriano Almeida

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

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()
52
Enthusiast

Interessanterweise ist len(unique()) oft einige Male (3x-15x) schneller als nunique().

35
Roman Kh

Möglicherweise passt dies am besten zu Ihrer Anfrage.

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

und GROUPBY zählen als

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

Mit crosstab werden mehr Informationen als groupbynunique 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
0
Wen-Ben

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
0
Gangaraju