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?

0voto

not a robot Punkte 3525
  • Um die Anzahl der verschiedenen Kunden und Größen pro Jahr zu erhalten (d.h. die Anzahl der eindeutigen Werte mehrerer Spalten), verwenden Sie eine Liste von Spalten:

    df.groupby('YEARMONTH')[['CLIENTCODE', 'SIZE']].nunique()
  • Eigentlich kann das Ergebnis aus dem obigen Code mit SQL-Syntax auf df mit pandasql (einem Modul, das auf pandas aufgebaut ist und es ermöglicht, pandas DataFrames mit SQL-Syntax abzufragen) erhalten werden.

    #! pip install pandasql
    from pandasql import sqldf
    sqldf("""
    SELECT COUNT(DISTINCT CLIENTCODE), 
           COUNT(DISTINCT SIZE)
      FROM df 
      GROUP BY YEARMONTH
    """)
  • Wenn Sie YEARMONTH als Spalte beibehalten möchten, d.h. das Pendant zur folgenden SQL-Abfrage

    SELECT YEARMONTH, 
           COUNT(DISTINCT CLIENTCODE),
           COUNT(DISTINCT SIZE)
      FROM df 
      GROUP BY YEARMONTH

    in pandas ist folgendes (setze as_index auf False):

    df.groupby('YEARMONTH', as_index=False)[['CLIENTCODE', 'SIZE']].nunique()
  • Wenn Sie benutzerdefinierte Namen für die aggregierten Spalten festlegen möchten, d.h. das Äquivalent zur folgenden SQL-Abfrage:

    SELECT YEARMONTH, 
           COUNT(DISTINCT CLIENTCODE) AS `Anzahl Kunden`, 
           COUNT(DISTINCT SIZE) AS `Anzahl Größe`
      FROM df 
      GROUP BY YEARMONTH

    verwenden Sie benannte Aggregation in pandas:

    (
        df.groupby('YEARMONTH', as_index=False)
          .agg(**{'Anzahl Kunden':('CLIENTCODE', 'nunique'), 
                  'Anzahl Größe':('SIZE', 'nunique')})
    )

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