398 Stimmen

Pandas 'count(distinct)'-Äquivalent

Ich verwende Pandas als Ersatz für eine Datenbank, da ich mehrere Datenbanken (Oracle, SQL Server, etc.) habe und nicht in der Lage bin, eine Abfolge von Befehlen zu einem SQL-Äquivalent zu machen.

Ich habe eine Tabelle in einem DataFrame geladen mit einigen Spalten:

YEARMONTH, CLIENTCODE, SIZE, etc., etc.

In SQL würde es so aussehen, um die Anzahl der verschiedenen Kunden 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?

580voto

Dan Allan Punkte 33695

Ich glaube, das ist das, was du möchtest:

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

130voto

StatguyUser Punkte 2483

Hier ist eine weitere Methode und sie ist viel einfacher. Angenommen, der Name Ihres DataFrame lautet daat und der Spaltenname lautet YEARMONTH:

daat.YEARMONTH.value_counts()

54voto

Roman Kh Punkte 2658

Interessanterweise ist es sehr oft so, dass len(unique()) ein paar Mal (3x-15x) schneller ist als nunique().

19voto

Gangaraju Punkte 4238

Ich benutze auch nunique, aber es wäre sehr hilfreich, wenn Sie eine Aggregatfunktion wie 'min', 'max', 'count' oder 'mean' verwenden.

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

16voto

Vivek Payasi Punkte 549

Distinct of column along with aggregations on other columns

Um die Anzahl unterschiedlicher Werte für eine Spalte zu erhalten (CLIENTCODE in Ihrem Fall), können wir nunique verwenden. Wir können die Eingabe als Dictionary in die agg-Funktion übergeben, zusammen mit Aggregationen für andere Spalten:

grp_df = df.groupby('YEARMONTH').agg({'CLIENTCODE': ['nunique'],
                                      'other_col_1': ['sum', 'count']})

# um die mehrstufigen Spalten zu vereinfachen
grp_df.columns = ["_".join(col).strip() for col in grp_df.columns.values]

# wenn Sie den Index zurücksetzen möchten
grp_df.reset_index(inplace=True)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X