So erstellen Sie Pivot-Tabellen mit Pandas


Eine Pivot-Tabelle ist ein Datenanalysetool, mit dem Sie Spalten mit Rohdaten aus einem Pandas-DataFrame übernehmen, diese zusammenfassen und dann die zusammenfassenden Daten analysieren können, um Erkenntnisse zu gewinnen.

Mit Pivot-Tabellen können Sie gängige aggregierte statistische Berechnungen wie Summen, Zählungen, Durchschnittswerte usw. durchführen. Oftmals offenbaren die Informationen, die eine Pivot-Tabelle liefert, Trends und andere Beobachtungen, die Ihre ursprünglichen Rohdaten verbergen.

Pivot-Tabellen wurden ursprünglich in frühen Tabellenkalkulationspaketen implementiert und sind auch in den neuesten Paketen immer noch eine häufig verwendete Funktion. Auch in modernen Datenbankanwendungen und in Programmiersprachen sind sie zu finden. In diesem Tutorial erfahren Sie, wie Sie mit der Methode DataFrame.pivot_table() von Pandas eine Pivot-Tabelle in Python implementieren.

Bevor Sie beginnen, sollten Sie sich damit vertraut machen, wie ein Pandas-DataFrame aussieht und wie Sie einen erstellen können. Es wird sich auch als nützlich erweisen, den Unterschied zwischen einem DataFrame und einer Pandas-Serie zu kennen.

Darüber hinaus möchten Sie möglicherweise das Datenanalysetool Jupyter Notebook verwenden, während Sie die Beispiele in diesem Tutorial durcharbeiten. Alternativ bietet Ihnen JupyterLab ein verbessertes Notebook-Erlebnis, Sie können jedoch auch jede beliebige Python-Umgebung verwenden.

Das andere, was Sie für dieses Tutorial benötigen, sind natürlich Daten. Sie verwenden die Daten „Sales Data Presentation – Dashboards“, die Ihnen unter der Apache 2.0-Lizenz kostenlos zur Nutzung zur Verfügung stehen. Die Daten stehen Ihnen in der Datei sales_data.csv zur Verfügung, die Sie herunterladen können, indem Sie auf den untenstehenden Link klicken.

In dieser Tabelle finden Sie eine Erläuterung der Daten, die Sie in diesem Tutorial verwenden werden:

Column Name Data Type (PyArrow) Description
order_number int64 Order number (unique)
employee_id int64 Employee’s identifier (unique)
employee_name string Employee’s full name
job_title string Employee’s job title
sales_region string Sales region employee works within
order_date timestamp[ns] Date order was placed
order_type string Type of order (Retail or Wholesale)
customer_type string Type of customer (Business or Individual)
customer_name string Customer’s full name
customer_state string Customer’s state of residence
product_category string Category of product (Bath Products, Gift Basket, Olive Oil)
product_number string Product identifier (unique)
product_name string Name of product
quantity int64 Quantity ordered
unit_price double Selling price of one product
sale_price double Total sale price (unit_price × quantity)

Wie Sie sehen können, speichert die Tabelle Daten für einen fiktiven Satz von Bestellungen. Jede Zeile enthält Informationen zu einer einzelnen Bestellung. Während Sie das Tutorial durcharbeiten und versuchen, die verschiedenen darin enthaltenen Herausforderungsübungen zu lösen, werden Sie mit den Daten vertrauter.

In diesem Tutorial verwenden Sie die Pandas-Bibliothek, um mit DataFrames und der neueren PyArrow-Bibliothek arbeiten zu können. Die PyArrow-Bibliothek stellt Pandas eigene optimierte Datentypen zur Verfügung, die schneller und weniger speicherintensiv sind als die herkömmlichen NumPy-Typen, die Pandas standardmäßig verwendet.

Wenn Sie an der Befehlszeile arbeiten, können Sie sowohl pandas als auch pyarrow mit python -m pip install pandas pyarrow installieren, möglicherweise innerhalb von a virtuelle Umgebung, um Konflikte mit Ihrer vorhandenen Umgebung zu vermeiden. Wenn Sie in einem Jupyter-Notebook arbeiten, sollten Sie !python -m pip install pandas pyarrow verwenden. Wenn die Bibliotheken vorhanden sind, können Sie Ihre Daten dann in einen DataFrame einlesen:

>>> import pandas as pd

>>> sales_data = pd.read_csv(
...     "sales_data.csv",
...     parse_dates=["order_date"],
...     dayfirst=True,
... ).convert_dtypes(dtype_backend="pyarrow")

Zunächst haben Sie import pandas verwendet, um die Bibliothek in Ihrem Code verfügbar zu machen. Um den DataFrame zu erstellen und ihn in die Variable sales_data einzulesen, haben Sie die Funktion read_csv() von Pandas verwendet. Der erste Parameter bezieht sich auf die Datei, die gelesen wird, während parse_dates hervorhebt, dass die Daten der Spalte order_date als datetime64[ns] gelesen werden sollen Typ. Es gibt jedoch ein Problem, das dies verhindern wird.

In Ihrer Quelldatei liegen die Bestelldaten im Format dd/mm/yyyy vor. Um read_csv() also mitzuteilen, dass der erste Teil jedes Datums einen Tag darstellt, müssen Sie auch Setzen Sie den Parameter dayfirst auf True. Dadurch kann read_csv() nun die Bestelldaten als datetime64[ns]-Typen lesen.

Wenn Bestelldaten erfolgreich als datetime64[ns]-Typen gelesen wurden, kann die Methode .convert_dtypes() diese dann erfolgreich in einen timestamp[ns][pyarrow] konvertieren -Datentyp und nicht den allgemeineren string[pyarrow]-Typ, den es sonst gegeben hätte. Obwohl dies etwas umständlich erscheinen mag, können Sie mit Ihren Bemühungen Daten nach Datum analysieren, falls dies erforderlich sein sollte.

Wenn Sie einen Blick auf die Daten werfen möchten, können Sie sales_data.head(2) ausführen. Dadurch können Sie die ersten beiden Zeilen Ihres Datenrahmens sehen. Wenn Sie .head() verwenden, sollten Sie dies vorzugsweise in einem Jupyter-Notebook tun, da alle Spalten angezeigt werden. Viele Python-REPLs zeigen nur die ersten und letzten Spalten an, es sei denn, Sie verwenden pd.set_option("display.max_columns", None), bevor Sie .head() ausführen.

Wenn Sie überprüfen möchten, ob PyArrow-Typen verwendet werden, wird sales_data.dtypes dies für Sie bestätigen. Wie Sie sehen werden, enthält jeder Datentyp [pyarrow] in seinem Namen.

Jetzt ist es an der Zeit, Ihre erste Pandas-Pivot-Tabelle mit Python zu erstellen. Dazu lernen Sie zunächst die Grundlagen der Verwendung der DataFrame-Methode .pivot_table() kennen.

So erstellen Sie Ihre erste Pivot-Tabelle mit Pandas

Da Ihre Lernreise nun begonnen hat, ist es an der Zeit, Ihren ersten Lernmeilenstein zu erreichen und die folgende Aufgabe zu erledigen:

Berechnen Sie den Gesamtumsatz für jede Auftragsart und jede Region.

Da Ihnen so viele Daten zur Verfügung stehen und die Methode .pivot_table() so viele Parameter unterstützt, fühlen Sie sich möglicherweise etwas überfordert. Mach dir keine Sorge. Wenn Sie die Dinge Schritt für Schritt angehen und vorher sorgfältig durchdenken, werden Sie im Handumdrehen aufschlussreiche Pivot-Tabellen erstellen.

Bevor Sie eine Pivot-Tabelle erstellen, sollten Sie zunächst überlegen, wie die Daten angezeigt werden sollen. Ein Ansatz wäre, für jede Produktkategorie eine eigene Spalte und für jede Region eine eigene Zeile zu haben. Der Gesamtumsatz für jede Produktkategorie und jede Region könnte dann im Schnittpunkt jeder Zeile und Spalte platziert werden.

Nachdem Sie darüber nachgedacht haben, notieren Sie einige Gedanken und berechnen einige Beispielergebnisse, um Ihnen zu helfen, zu visualisieren, was Sie wollen:

Da Sie damit zufrieden sind, müssen Sie als Nächstes Ihren Plan in die Parameter übersetzen, die für die Methode DataFrame.pivot_table() erforderlich sind. In diesem Fall benötigen Sie folgende Parameter: values, index, columns und aggfunc. Es ist wichtig zu verstehen, wozu diese dienen, da es sich dabei um die Kernparameter handelt, die in den meisten Pivot-Tabellen verwendet werden.

Ihre Pivot-Tabelle führt ihre Berechnungen auf Grundlage der Verkaufspreiszahlen durch. Diese werden zu den Werten, die an den Parameter values übergeben werden und Ihrer Pivot-Tabelle die Zahlen geben, mit denen sie arbeiten muss. Wenn Sie diesen Parameter nicht angeben, verwendet die Pivot-Tabelle standardmäßig alle numerischen Spalten.

Mit dem Parameter index geben Sie an, wie die Daten gruppiert werden sollen. Denken Sie daran, dass Sie den Gesamtumsatz für jede Bestellart und jede Region ermitteln müssen. Sie haben sich entschieden, eine Zeile aggregierter Daten basierend auf dem Feld sales_region zu erstellen, daher wird diese als Parameter index übergeben.

Sie möchten außerdem für jede Auftragsart eine eigene Spalte. Dies wird dem Parameter columns zugewiesen.

Schließlich müssen Sie Ihrer Pivot-Tabelle auch mitteilen, dass Sie den Gesamtumsatz für jede Aggregation berechnen möchten. Um eine einfache Pivot-Tabelle zu erstellen, setzen Sie den Parameter aggfunc auf, in diesem Fall die Funktion sum().

Nachdem Sie Ihren Plan nun vollständig durchdacht haben, können Sie mit dem Codieren Ihrer Pivot-Tabelle beginnen:

>>> pd.set_option("display.float_format", "${:,.2f}".format)

>>> sales_data.pivot_table(
...     values="sale_price", index="sales_region", columns="order_type",
...     aggfunc="sum",
... )
order_type          Retail   Wholesale
sales_region
Central East   $102,613.51 $149,137.89
N Central East $117,451.69 $152,446.42
N Central West  $10,006.42   $1,731.50
Northeast       $84,078.95 $127,423.36
Northwest       $34,565.62  $33,240.12
S Central East $130,742.32 $208,945.73
S Central West  $54,681.80  $51,051.03
Southeast       $96,310.12 $127,554.60
Southwest      $104,743.52 $121,977.20

Wie Sie sehen können, hat .pivot_table() die Parameter verwendet, die Sie zuvor geplant haben, um Ihre Pivot-Tabelle zu erstellen.

Um die Zahlen als Währung zu formatieren, haben Sie die String-Format-Minisprache von Python verwendet. Diese Sprache wird an mehreren Stellen in Python verwendet, am häufigsten in F-Strings. Wenn Sie in diesem Zusammenhang bereits damit vertraut sind, erfahren Sie hier bereits, wie Sie es verwenden.

Durch Übergabe von "display.float_format" und "$ {:,.2f}".format an die Funktion set_option() von Pandas, Von diesem Punkt an definieren Sie das Format für Gleitkommazahlen. Sie werden auf 2 Dezimalstellen gerundet, verwenden ein Komma (,) als Tausendertrennzeichen und erhalten als Präfix die Währung ($). Symbol.

Sofern Sie dieses Format nicht für Ihre zukünftigen Gleitkommazahlen beibehalten möchten, müssen Sie die Formatierung auf die Standardeinstellung zurücksetzen, indem Sie pd.reset_option("display.float_format") nach verwenden. Pivot_table() wurde aufgerufen.

>>> with pd.option_context("display.float_format", "${:,.2f}".format):
...     sales_data.pivot_table(
...         values="sale_price", index="sales_region",
...         columns="order_type", aggfunc="sum",
...     )

Die with-Anweisung definiert den Start des Kontextmanagers. Anschließend definieren Sie mit pd.option_context() die Formatierung, die für Gleitkommazahlen verwendet werden soll. Dadurch wird sichergestellt, dass Ihr Format nur auf den eingerückten Code darunter angewendet wird, in diesem Fall auf die Funktion .pivot_table(). Sobald der eingerückte Code fertig ist, ist der Kontextmanager nicht mehr im Gültigkeitsbereich und die vorherige Formatierung kommt wieder ins Spiel.

Wenn Sie den Kontextmanager in Jupyter oder IPython verwenden, wird leider das Drucken der Ausgabe unterdrückt, es sei denn, Sie drucken explizit. Aus diesem Grund werden Kontextmanager in diesem Tutorial nicht verwendet.

Während Sie mit Ihrem Ergebnis grundsätzlich zufrieden sind, haben Sie das Gefühl, dass etwas fehlt: Summen. Ursprünglich hatten Sie nicht darüber nachgedacht, Summenspalten einzubeziehen, aber jetzt wird Ihnen klar, dass dies nützlich wäre. Um dies zu beheben, konsultieren Sie die Dokumentation und finden die folgende Lösung:

>>> pd.set_option("display.float_format", "${:,.2f}".format)

>>> sales_data.pivot_table(
...     values="sale_price", index="sales_region", columns="order_type",
...     aggfunc="sum", margins=True, margins_name="Totals",
... )
order_type          Retail   Wholesale        Totals
sales_region
Central East   $102,613.51 $149,137.89   $251,751.40
N Central East $117,451.69 $152,446.42   $269,898.11
N Central West  $10,006.42   $1,731.50    $11,737.92
Northeast       $84,078.95 $127,423.36   $211,502.31
Northwest       $34,565.62  $33,240.12    $67,805.74
S Central East $130,742.32 $208,945.73   $339,688.05
S Central West  $54,681.80  $51,051.03   $105,732.83
Southeast       $96,310.12 $127,554.60   $223,864.72
Southwest      $104,743.52 $121,977.20   $226,720.72
Totals         $735,193.95 $973,507.85 $1,708,701.80

Um dieses Mal den letzten Schliff zu geben, legen Sie margins=True und margins_name="Totals" fest. Der Parameter margins=True hat rechts und unten in Ihrer Pivot-Tabelle neue Spalten hinzugefügt. Jedes enthält die Gesamtsummen der Zeilen bzw. Spalten. Der Parameter margins_name fügte „Totals“-Beschriftungen anstelle der standardmäßigen „Alle“-Beschriftungen ein, die andernfalls angezeigt würden.

Jetzt sind Sie an der Reihe. Probieren Sie die folgende Übung aus, um Ihr Verständnis zu testen:

Erstellen Sie eine Pivot-Tabelle, die den höchsten Verkaufspreis für jede Verkaufsregion nach Produktkategorie anzeigt. Dieses Mal sollte jede Vertriebsregion in einer separaten Spalte und jede Produktkategorie in einer separaten Zeile stehen. In diesem Beispiel können Sie die Gesamtzahl der Zeilen und Spalten ignorieren, sollten jedoch ein Währungsformat mit dem Symbol $ anwenden und den Unterstrich (_) als Tausender verwenden Separator. Auch hier sind zwei Nachkommastellen erforderlich.

Eine mögliche Lösung für diese Übung finden Sie im Jupyter-Notizbuch solutions.ipynb, das in den herunterladbaren Materialien enthalten ist.

Wenn Sie es bis hierher geschafft haben, verstehen Sie nun die wichtigsten Prinzipien der Erstellung von Pivot-Tabellen. Glückwunsch! Aber entspannen Sie sich noch nicht, denn es gibt noch mehr Spannendes zu lernen. Lesen Sie weiter, um Ihr Wissen noch weiter zu erweitern.

Einbinden von Unterspalten in Ihre Pivot-Tabelle

In jeder Ihrer vorherigen Pivot-Tabellen haben Sie dem Parameter columns eine einzelne DataFrame-Serie zugewiesen. Dadurch wurde für jeden eindeutigen Eintrag innerhalb der zugewiesenen Serie eine separate Spalte in Ihre Pivot-Tabelle eingefügt. Durch die Zuweisung von "order_type" zu Spalten enthielt Ihre Pivot-Tabelle also sowohl die Spalten Einzelhandel als auch Großhandel, jeweils eine Art der Bestellung. Es ist an der Zeit, Ihr Wissen weiter zu erweitern und zu lernen, wie Sie Unterspalten in Ihre Pivot-Tabelle einbinden.

Hier ist der nächste Meilenstein für Sie:

Berechnen Sie den durchschnittlichen Umsatz der verschiedenen Arten von Bestellungen, die von jedem Kundentyp für jeden Bundesstaat aufgegeben werden.

Halten Sie wie zuvor inne und denken Sie nach. Der erste Schritt besteht darin, zu überlegen, was Sie sehen möchten, und die relevanten Parameter in Ihren Plan einzubeziehen.

Eine Möglichkeit wäre, den Status jedes Kunden einzeln in einer Zeile anzuzeigen. Was die anzuzeigenden Spalten betrifft, könnten Sie für jeden Kundentyp eine separate Spalte und dann Unterspalten für jeden Bestelltyp innerhalb jedes Kundentyps haben. Die Berechnung basiert erneut auf dem Verkaufspreis, außer dass Sie diesmal die Durchschnittswerte ermitteln müssen.

Sie holen noch einmal Stift und Papier heraus und erstellen eine schnelle Visualisierung:

Nachdem Sie dies nun durchdacht haben und zufrieden sind, können Sie Ihren Plan auf die Parameter anwenden. Wie zuvor verwendet die Berechnung die Werte in der Spalte sale_price, sodass Sie diese als Parameter values verwenden. Da Sie die Durchschnittswerte wünschen, können Sie aggfunc="mean" festlegen. Da dies jedoch der Standardwert ist, ist dies nicht erforderlich. Jede Zeile basiert auf dem Status des Kunden, daher müssen Sie index="customer_state" festlegen.

Schließlich müssen Sie über die Spalten nachdenken. Da Sie dieses Mal Kundentypen als oberste Spalte mit unterschiedlichen Bestelltypen für jeden von ihnen haben möchten, ist Ihr columns-Parameter die Liste ["customer_type", "order_type"]. Es ist möglich, durch die Übergabe einer längeren Liste mehrere verschachtelte Unterspalten zu erstellen, aber zwei Spalten sind hier in Ordnung.

Um Ihre Anforderungen zu erfüllen, verwenden Sie den unten gezeigten Code:

>>> pd.set_option("display.float_format", "${:,.2f}".format)

>>> sales_data.pivot_table(
...     values="sale_price", index="customer_state",
...     columns=["customer_type", "order_type"], aggfunc="mean",
... )
customer_type        Business           Individual
order_type             Retail Wholesale     Retail
customer_state
Alabama               $362.67   $762.73    $137.47
Alaska                $295.33   $799.83    $137.18
Arizona               $407.50 $1,228.52    $194.46
Arkansas                 <NA> $1,251.25    $181.65
California            $110.53 $1,198.89    $170.94
...

Wie Sie sehen, hat die Übergabe der Spaltenliste die erforderliche Analyse für Sie erbracht. Auch hier haben Sie eine geeignete Formatzeichenfolge angewendet, um die Lesbarkeit Ihrer Ausgabe zu gewährleisten. Es gab keine Einzelhandelsumsätze von Unternehmen in Arkansas, weshalb hier angezeigt wird. Beachten Sie, dass das Standardverhalten des Parameters aggfunc darin besteht, den Mittelwert der Daten zu berechnen. Sie haben ihn hier jedoch nur der Übersichtlichkeit halber eingefügt.

Werfen Sie nun einen Blick zurück auf Ihre ursprüngliche Visualisierung und vergleichen Sie sie mit dem, was Ihr Code tatsächlich erzeugt hat. Fällt Ihnen etwas anderes auf? Das ist richtig, es gibt keine Spalte Individueller Großhandel in Ihrer Ausgabe. Dies liegt daran, dass keine entsprechenden Werte eingegeben werden können. Die Methode .pivot_table() hat es automatisch entfernt, um die Anzeige einer leeren Spalte zu verhindern.

Es ist Zeit für einen weiteren Kontrollpunkt Ihres Verständnisses. Sehen Sie, ob Sie diese nächste Herausforderung lösen können:

Erstellen Sie eine Pivot-Tabelle, die die höchsten Mengen jeder Produktkategorie innerhalb jedes Kundentyps anzeigt. Ihre Pivot-Tabelle sollte eine Zeile für jeden Staat enthalten, in dem die Kunden leben. Fügen Sie zusammenfassende Gesamtsummen mit der Bezeichnung „Max. Menge“ hinzu.

Sehen Sie sich als zusätzliche Herausforderung die Dokumentation zur Methode .pivot_table() an und finden Sie heraus, wie Sie die Werte durch Nullen ersetzen können.

Eine mögliche Lösung für diese Übungen finden Sie im solutions.ipynb Jupyter Notebook, das in den herunterladbaren Materialien enthalten ist.

Nachdem Sie nun wissen, wie man mit Unterspalten arbeitet, ist es an der Zeit, zu lernen, wie man Unterzeilen verwendet.

Einbinden von Unterzeilen in Ihre Pivot-Tabelle

Im vorherigen Abschnitt haben Sie gesehen, wie Sie durch die Übergabe einer Liste an den Parameter columns Unterspalten erstellen können. Sie haben vielleicht schon erraten, dass Sie zum Analysieren des Datenverkehrs nach einer Zeile innerhalb einer anderen eine Liste an den Parameter index übergeben. Nach wie vor können Sie dies anhand eines Beispiels besser verstehen. Hier ist Ihr nächster Meilenstein:

Berechnen Sie den Gesamtumsatz jeder Ihrer verschiedenen Produktkategorien, zeigen Sie aber auch Details zu den verschiedenen Arten von Bestellungen an, die von den verschiedenen Kundentypen aufgegeben wurden.

Machen Sie wie gewohnt einen Schritt zurück und beginnen Sie mit der sorgfältigen Planung Ihrer Lösung.

Eine Möglichkeit, dieses Problem zu lösen, wäre, für jede Produktkategorie eine separate Spalte und eine separate Zeile zur Analyse der Bestelltypen innerhalb der Kundentypen zu haben. Auch hier werden Sie mit Summen der Verkaufszahlen arbeiten.

Schärfen Sie Ihren Bleistift:

Die Berechnung basiert auf dem Verkaufspreis, der Ihr Parameter values ist, während durch die Einstellung aggfunc="sum" sichergestellt wird, dass Gesamtsummen berechnet werden. Um jede Produktkategorie in eine eigene Spalte zu unterteilen, weisen Sie diese dem Parameter columns zu. Um schließlich sicherzustellen, dass der Kundentyp nach Bestelltyp unteranalysiert wird, weisen Sie ["customer_type", "order_type"] dem Parameter index zu.

Wenn Sie Ihren Plan in Code umwandeln, ist das Ergebnis:

>>> pd.set_option("display.float_format", "${:,.2f}".format)

>>> sales_data.pivot_table(
...     values="sale_price", index=["customer_type", "order_type"],
...     columns="product_category", aggfunc="sum",
... )
product_category          Bath products  Gift Basket   Olive Oil
customer_type order_type
Business      Retail          $1,060.87    $3,678.50  $23,835.00
              Wholesale       $6,024.60   $18,787.50 $948,695.75
Individual    Retail         $32,711.58  $113,275.00 $560,633.00
...

Hier haben Sie erfahren, dass Sie durch die Übergabe einer Liste von Spalten an index die erforderliche Analyse erstellen können. Sie haben erneut $ {:,.2f} verwendet, um sicherzustellen, dass die Währung korrekt formatiert wurde.

Zeit für Ihren nächsten Wissenscheck. Versuchen Sie, Folgendes zu lösen:

Dieses Mal möchten Sie eine Pivot-Tabelle, die die gesamten verkauften Produktmengen analysiert, analysiert nach Kundenstatus innerhalb des Bestelltyps und nach Produktkategorie innerhalb des Kundentyps. Sie sollten die -Werte durch Nullen ersetzen.

Eine mögliche Lösung für diese Übung finden Sie im solutions.ipynb Jupyter Notebook, das in den herunterladbaren Materialien enthalten ist.

Nachdem Sie nun wissen, wie man mit Unterspalten und Unterzeilen arbeitet, denken Sie vielleicht, dass Sie damit fertig sind. Aber es gibt noch mehr! Als Nächstes erfahren Sie, wie Sie mehrere Werte in Ihre Berechnungen einbeziehen.

Berechnen mehrerer Werte in Ihrer Pivot-Tabelle

Bisher hat jede Ihrer Pivot-Tabellen Daten aus einer einzelnen Spalte analysiert, z. B. sale_price oder quantity. Angenommen, Sie möchten Daten aus beiden Spalten auf die gleiche Weise analysieren. Können Sie erraten, wie es geht? Wenn Sie darüber nachdenken, beide Spalten einer Liste für den Parameter values bereitzustellen, liegen Sie genau richtig.

Basierend auf Ihren bisherigen Fortschritten ist der nächste Meilenstein in greifbarer Nähe:

Berechnen Sie die Summe der Verkaufspreise und verkauften Mengen jeder Produktkategorie innerhalb jeder Vertriebsregion.

Fast unbewusst ist Ihr Gehirn in den Planungsmodus geraten:

Eine Lösung bestünde darin, Zeilen für jede Produktkategorie innerhalb jeder Verkaufsregion zu erstellen und dann die Gesamtmenge und den Verkaufspreis für jede einzelne in separaten Spalten anzuzeigen. Mit anderen Worten: Sie denken darüber nach, so etwas zu erstellen:

Um dies umzusetzen, verwenden Sie ähnliche Prinzipien wie zuvor, es gibt jedoch ein oder zwei Einschränkungen, die Sie beachten müssen. Um Gesamtsummen zu berechnen, legen Sie aggfunc="sum" fest, während Sie fill_value-Werte zu verarbeiten, indem Sie sie durch Null ersetzen > auf 0. Um die Zeilen zu erstellen, die die nach Produktkategorie unteranalysierten Verkaufsregionen anzeigen, übergeben Sie beide in einer Liste an index.

Der Code, den Sie für all dies verwenden können, ist unten dargestellt:

>>> pd.set_option("display.float_format", "${:,.2f}".format)

>>> sales_data.pivot_table(
...     index=["sales_region", "product_category"],
...     values=["sale_price", "quantity"],
...     aggfunc="sum", fill_value=0,
... )
                                 quantity  sale_price
sales_region   product_category
Central East   Bath Products          543   $5,315.40
               Gift Basket            267  $16,309.50
               Olive Oil             1497 $230,126.50
N Central East Bath Products          721   $6,905.36
               Gift Basket            362  $21,533.00
               Olive Oil             1648 $241,459.75
N Central West Bath Products           63     $690.92
               Gift Basket             26   $2,023.50
               Olive Oil               87   $9,023.50
...

Um die Summen von sale_price und quantity zu berechnen, haben Sie diese als Liste an den Parameter values übergeben. Ein kleines Problem besteht darin, dass die Berechnungsspalten anders als in der Definitionsliste angezeigt werden. In diesem Beispiel haben Sie ["sale_price", "quantity"] an values übergeben, aber wenn Sie sich die Ausgabe genau ansehen, werden Sie feststellen, dass sie alphabetisch angezeigt wird.

Sie haben erneut "$ {:,.2f}" verwendet, um sicherzustellen, dass die Währung korrekt formatiert wurde. Beachten Sie, dass dies nur für Floats gilt. Die Formatierung der Ganzzahlwerte quantity erledigte sich von selbst.

Ein weiterer zu beachtender Punkt ist, dass es keinen columns-Parameter gibt. Sie haben vielleicht gedacht, dass die an values übergebene Liste an columns hätte übergeben werden sollen, aber das ist nicht der Fall. Mit dem Parameter columns sowie index können Sie definieren, wie Daten gruppiert werden. In diesem Beispiel gruppieren Sie nicht nach Verkaufspreis oder Menge. Stattdessen verwenden Sie sie in einer Berechnung. Daher müssen ihnen Werte zugewiesen werden.

>>> pd.set_option("display.float_format", "${:,.2f}".format)

>>> sales_data.pivot_table(
...     index=["sales_region", "product_category"],
...     values=["sale_price", "quantity"],
...     aggfunc="sum", fill_value=0,
... ).loc[:, ["sale_price", "quantity"]]

Sie können Daten aus einer Pivot-Tabelle mithilfe des Attributs .loc[] abrufen. Auf diese Weise können Sie die Zeilen und Spalten, die Sie sehen möchten, anhand ihrer Indexbezeichnungen definieren.

In diesem Fall wollten Sie alle Zeilen anzeigen, also haben Sie einen Doppelpunkt (:) als ersten Parameter von .loc[] übergeben. Da Sie dann sowohl die Spalten sale_price als auch quantity in dieser Reihenfolge sehen wollten, haben Sie diese als Liste an den zweiten Parameter übergeben.

Fahren Sie fort und führen Sie diesen Code aus. Sie werden sehen, dass die Spalten in derselben Reihenfolge sind, wie sie in der an .loc[] übergebenen Liste definiert wurden.

Es ist Zeit, die graue Substanz noch einmal zu massieren. Sehen Sie, ob Sie die nächste Herausforderung lösen können:

Angenommen, Sie möchten mehr über den Umsatz Ihres Unternehmens erfahren. Erstellen Sie eine Pivot-Tabelle mit Zeilen, die die verschiedenen Bestelltypen für jeden Kundentyp analysieren, und mit Spalten, die die Gesamtmenge für jede Produktkategorie sowie den Gesamtumsatz für jede bestellte Produktkategorie anzeigen.

Eine mögliche Lösung für diese Übung finden Sie im solutions.ipynb Jupyter Notebook, das in den herunterladbaren Materialien enthalten ist.

Inzwischen sind Sie ein kompetenter Ersteller von Pivot-Tabellen. Sie fragen sich vielleicht, was es sonst noch zu lernen gibt. Wenn Sie wissen möchten, wie Sie unterschiedliche Aggregationsfunktionen auf dieselben Daten anwenden, unterschiedliche Aggregationsfunktionen auf unterschiedliche Daten anwenden oder sogar Ihre eigenen benutzerdefinierten Aggregationsfunktionen schreiben, lesen Sie weiter.

Durchführen erweiterter Aggregationen

Jetzt, wo Sie voller Selbstvertrauen in die Höhe fliegen, fragen Sie sich, ob Sie Folgendes tun können:

Berechnen Sie den maximalen und Mindestumsatz jeder Produktkategorie für jeden Kundentyp.

Wenn das Kühlsystem Ihres Gehirns jetzt auf Hochtouren läuft, können Sie wieder anfangen, über die Dinge nachzudenken.

Um dieses Problem zu lösen, müssen Sie mehrere Aggregationsfunktionen auf dieselben Daten anwenden. Bisher haben Sie beim Analysieren von Daten anhand mehrerer Kriterien Listen an einen entsprechenden Parameter übergeben. Können Sie erraten, wie man mehrere Funktionen anwendet? Wenn nicht, wird die Antwort unten angezeigt:

>>> pd.set_option("display.float_format", "${:,.2f}".format)

>>> sales_data.pivot_table(
...     values=["sale_price"], index="product_category",
...     columns="customer_type", aggfunc=["max", "min"],
... )
                        max                   min
                 sale_price            sale_price
customer_type      Business Individual   Business Individual
product_category
Bath Products       $300.00    $120.00      $5.99      $5.99
Gift Basket       $1,150.00    $460.00     $27.00     $19.50
Olive Oil         $3,276.00    $936.00     $16.75     $16.75

Hier haben Sie mehrere Funktionen auf dieselben Daten angewendet, indem Sie sie als Liste an den Parameter aggfunc übergeben haben. Sie haben außerdem beschlossen, für jede Produktkategorie eine Zeile zu erstellen, die zum Parameter index wurde. Ihre Berechnungen basierten auf dem Verkaufspreis, also haben Sie diesen als Parameter values übergeben. Da Sie es als Liste übergeben haben, haben Sie dafür gesorgt, dass die Überschrift Verkaufspreis zur besseren Lesbarkeit als zusätzliche Spaltenüberschrift erscheint.

Da Sie außerdem Daten nach Kundentyp anzeigen wollten, haben Sie sich entschieden, dies zum Parameter columns zu machen. Um sowohl eine "max"- als auch eine "min"-Berechnung durchzuführen, haben Sie beide Werte an den aggfunc-Parameter innerhalb einer Liste übergeben.

Als nächstes beschließen Sie, das Boot etwas weiter hinauszuschieben, indem Sie Folgendes versuchen:

Passen Sie die vorherige Analyse an, um sowohl den durchschnittlichen Verkaufspreis als auch die maximal verkaufte Menge anzuzeigen.

Wenn Sie darüber nachdenken, wird Ihnen klar, dass dies ein Beispiel für die Anwendung verschiedener Aggregationsfunktionen auf verschiedene Daten wäre. Dazu müssen Sie keine Liste, sondern ein Wörterbuch an aggfunc übergeben, das jede Datenspalte und Aggregationsfunktion definiert, die darauf verwendet werden soll. Vergessen Sie nicht, sicherzustellen, dass jedes Datenelement auch im Parameter values erscheint.

Um diese Pivot-Tabelle zu erstellen, können Sie Folgendes tun:

>>> pd.set_option("display.float_format", "${:,.2f}".format)

>>> sales_data.pivot_table(
...     values=["sale_price", "quantity"],
...     index=["product_category"],
...     columns="customer_type",
...     aggfunc={"sale_price": "mean", "quantity": "max"},
... )
                 quantity            sale_price
customer_type    Business Individual   Business Individual
product_category
Bath Products          14          4     $53.27     $25.94
Gift Basket            14          4    $335.31    $156.24
Olive Oil              14          4  $1,385.37    $250.06

Die Pivot-Tabelle zeigt nun die maximalen Mengen für jeden der beiden Kundentypen und den durchschnittlichen Verkaufspreis für jeden an. Sie haben dies erreicht, indem Sie quantity an die Liste des Parameters values angehängt haben und dann vor .pivot_table()< ein Wörterbuch an aggfunc übergeben haben /code> hat seine Wirkung entfaltet.

Sie gehen weiter und schieben das Boot noch weiter hinaus, während Sie Folgendes tun:

Berechnen Sie, wie viele Mitarbeiter es in jeder Vertriebsregion gibt.

Auf den ersten Blick erscheint dies einfach. Sie denken schnell darüber nach und glauben, dass dieser Code Ihnen das geben wird, was Sie wollen:

>>> sales_data.pivot_table(
...     values="employee_id",
...     index="sales_region",
...     aggfunc="count",
... )
                employee_id
sales_region
Central East            697
N Central East          832
N Central West           70
Northeast               604
...

Wenn Sie diesen Code ausführen, scheint es in jeder Region viele Verkäufer zu geben. Diese Zahlen sind falsch, da count doppelte employee_id-Werte gezählt hat. Wenn Sie einen Blick zurück auf die Originaldaten werfen, werden Sie feststellen, dass derselbe Mitarbeiter in seiner Vertriebsregion mehrfach aufgeführt ist. Sie müssen umdenken.

Bisher haben Sie den Parameter aggfunc verwendet, um die Funktionen anzugeben, die zur Durchführung der Aggregationsberechnungen verwendet werden. Jeder von ihnen nahm die durch den Parameter values definierte Reihe und aggregierte sie gemäß den Parametern index und columns zu einem einzelnen Wert. Sie können diese Ideen noch einen Schritt weiterführen und Ihre eigene benutzerdefinierte Aggregationsfunktion schreiben, vorausgesetzt, sie verwendet eine Reihe als Argument und gibt einen einzelnen aggregierten Wert zurück.

Wenn Sie Ihre eigene Aggregationsfunktion schreiben, müssen Sie eine Unterreihe von employee_id-Werten für jede sales_region übergeben. Ihre Funktion muss dann ermitteln, wie viele eindeutige Werte in jeder Unterreihe vorhanden sind, und die Ergebnisse an .pivot_table() zurückgeben. Eine Möglichkeit, eine solche Funktion zu schreiben, wird unten gezeigt:

>>> def count_unique(values):
...     return len(values.unique())
...

Ihre Funktion count_unique() akzeptierte eine Pandas-Serie mit dem Namen values und verwendete die Methode Series.unique(), um ein NumPy-Array mit den eindeutigen Elementen zu erhalten der Serie. Die in Python integrierte Funktion len() gab dann die Länge oder Anzahl der Elemente in jeder values-Reihe zurück.

Um Ihre Funktion aufzurufen und ihr die verschiedenen Unterreihen zu übergeben, weisen Sie den Namen der Funktion dem Parameter aggfunc von .pivot_table() zu. Glücklicherweise müssen Sie sich nicht um die Übergabe der einzelnen Unterreihen kümmern, da dies von .pivot_table() für Sie erledigt wird. Das bedeutet, dass Ihre Funktion für jede unterschiedliche Vertriebsregion einmal aufgerufen wird. Die Rückgabewerte werden dann in der resultierenden Pivot-Tabelle angezeigt.

Um zu sehen, wie das funktioniert, schauen Sie sich den folgenden Code an:

>>> sales_data.pivot_table(
...     values="employee_id",
...     index=["sales_region"],
...     aggfunc=count_unique,
... )
                employee_id
sales_region
Central East              6
N Central East            6
N Central West            1
Northeast                 4
...

Wie Sie sehen können, hat .pivot_table() durch die Zuweisung von count_unique zum Parameter aggfunc die Anzahl der eindeutigen Mitarbeiter-ID-Werte berechnet. Mit anderen Worten: Es wurde die Anzahl der Vertriebsmitarbeiter in jeder Region berechnet. Wieder ein Erfolg!

Zeit für eine weitere Herausforderung. Viel Spaß damit:

Prüfen Sie, ob Sie ermitteln können, wie viele einzigartige Produkte die Organisation in jeder Vertriebsregion verkauft und wie hoch die Gesamteinnahmen in jeder Region sind.

Eine mögliche Lösung für diese Übung ist im solutions.ipynb Jupyter Notebook enthalten, das in den herunterladbaren Materialien enthalten ist.

Zu diesem Zeitpunkt sind Sie nun ein Experte für die Erstellung von Pivot-Tabellen in Python. Abschließend erfahren Sie mehr über andere Möglichkeiten zum Aggregieren von Daten.

Verwendung von .groupby() und crosstab() für die Aggregation

Obwohl sich Ihre Erfahrung mit Pivot-Tabellen bisher auf .pivot_table() konzentriert hat, ist dies nicht die einzige Möglichkeit, Datenaggregation in Pandas durchzuführen. DataFrames verfügt außerdem über eine .groupby()-Methode, während Pandas eine crosstab()-Funktion bereitstellt, die auch Daten aggregiert. In diesem Abschnitt sehen Sie Beispiele dafür, wie sie für mehr als nur .pivot_table() verwendet werden können.

Eine für Sie möglicherweise nützliche Funktion, die in .groupby(), aber nicht in .pivot_table() vorhanden ist, sind benannte Aggregationen. Damit können Sie benutzerdefinierte Spaltenüberschriften anwenden, um die Anzeige Ihrer aggregierten Berechnungen zu verdeutlichen.

Hier ist Ihr nächster Lernmeilenstein:

Berechnen Sie die niedrigste, durchschnittliche, höchste und Standardabweichung der Preise jeder Produktkategorie und verwenden Sie dann benannte Aggregationen, um Ihre Ausgabe zu verbessern.

Sie beschließen, Ihr vorhandenes Wissen zu nutzen, um den folgenden Code zu planen und zu schreiben. Sie sind zuversichtlich, dass Sie dadurch zumindest die benötigten Daten sehen können:

>>> sales_data.pivot_table(
...     values="sale_price",
...     index="product_category",
...     aggfunc=["min", "mean", "max", "std"],
... )
                        min       mean        max        std
                 sale_price sale_price sale_price sale_price
product_category
Bath Products         $5.99     $28.55    $300.00     $23.98
Gift Basket          $19.50    $171.39  $1,150.00    $131.64
Olive Oil            $16.75    $520.78  $3,276.00    $721.49

Der obige Code hat Ihre Daten nach Produktkategorie analysiert und die minimale, durchschnittliche, maximale und Standardabweichung des Verkaufspreises berechnet. Obwohl diese Ausgabe Ihnen sicherlich das geliefert hat, was Sie wollten, sind die Spaltenüberschriften, die die einzelnen Verkaufspreise anzeigen, nicht sehr gut dargestellt. Hier können benannte Aggregationen helfen.

Um eine Aggregationsberechnung mit .groupby() durchzuführen, übergeben Sie ihm die Spalte oder Spalten, nach denen Sie gruppieren möchten. Dies gibt ein sogenanntes DataFrameGroupBy-Objekt zurück, das eine .agg()-Methode enthält, mit der Sie die zu verwendenden Aggregationsfunktionen sowie deren Überschriften definieren können .

Eine Möglichkeit, .agg() zu verwenden, besteht darin, ihm ein oder mehrere Tupel zu übergeben, die die Datenspalte und die Aggregationsfunktion enthalten, die für diese Spalte verwendet werden sollen. Sie übergeben jedes Tupel mit einem Schlüsselwort, das in der resultierenden Aggregation zum Namen der Überschrift wird.

Das obige Beispiel könnte mit .groupby() wie unten gezeigt geschrieben werden:

>>> (
...     sales_data
...     .groupby("product_category")
...     .agg(
...          low_price=("sale_price", "min"),
...          average_price=("sale_price", "mean"),
...          high_price=("sale_price", "max"),
...          standard_deviation=("sale_price", "std"),
...     )
... )
                  low_price  average_price  high_price  standard_deviation
product_category
Bath Products         $5.99         $28.55     $300.00              $23.98
Gift Basket          $19.50        $171.39   $1,150.00             $131.64
Olive Oil            $16.75        $520.78   $3,276.00             $721.49

Diesmal können Sie sehen, dass die Daten erneut nach Produktkategorie gruppiert sind, aber jede Gruppierung hat eine übersichtlichere Überschrift, die nach dem Schlüsselwort benannt ist, mit dem das Tupel angegeben wird. Wenn Sie tiefer in .groupby() und dessen Verwendung eintauchen möchten, lesen Sie pandas GroupBy: Your Guide to Grouping Data in Python.

Eine weitere gängige Methode zum Erstellen einer Aggregation ist die Verwendung der Funktion crosstab(). Dies hat eine ähnliche Funktionalität wie .pivot_table(), da es, wie Sie bereits erfahren haben, .pivot_table() verwendet, um seine Analyse durchzuführen. Der Hauptunterschied besteht darin, dass die Daten als einzelne Pandas-Serie an crosstab() übergeben werden.

Ihr letzter Meilenstein ist:

Berechnen Sie die Anzahl der Mitarbeiter in jeder Region, analysiert nach Berufsbezeichnung, mit crosstab().

Wenn Sie die Dokumentation durchlesen, werden Sie schnell feststellen, dass die Parameter von crosstab() denen von pivot_table() ähneln. Das bedeutet, dass Sie mehr über crosstab() wissen, als Sie zunächst dachten. Mit Ihren vorhandenen Kenntnissen können Sie den folgenden Code schnell planen und ausführen:

>>> pd.crosstab(
...     index=sales_data["job_title"],
...     columns=sales_data["sales_region"],
...     margins=True,
...     margins_name="Totals",
... )
sales_region                 Central East  N Central East \
job_title
Sales Associate                         0             132
Sales Associate I                       0               0
Sales Associate II                    139               0
Sales Associate III                     0               0
...
Totals                                697             832

N Central West  ...  Southeast  Southwest  Totals
                ...
             0  ...          0        138      357
            70  ...        195        254      929
             0  ...          0         95      727
             0  ...        231          0      358
                ...
            70  ...        694        731     5130
[10 rows x 10 columns]

Die von crosstab() verwendeten Parameter ähneln denen von pivot_table(). Tatsächlich hat im obigen Beispiel jeder Parameter die gleiche Wirkung wie sein pivot_table()-Äquivalent. Der einzige Unterschied besteht darin, dass die Datenreihe der Funktion crosstab() mithilfe einer DataFrame-Referenz übergeben werden muss, was bedeutet, dass Daten aus mehreren DataFrames stammen können. In diesem Beispiel wird jede Zeile nach Berufsbezeichnung analysiert, während jede Spalte nach Vertriebsregion analysiert wird.

Eine von crossstab() unterstützte Funktion, die nicht in .pivot_table() enthalten ist, ist der Parameter normalize. Wenn Sie normalize=True festlegen, dividieren Sie jede Zelle durch die Summe aller anderen Zellen im resultierenden DataFrame:

>>> pd.set_option("display.float_format", "{:.2%}".format)

>>> pd.crosstab(
...     index=sales_data["job_title"],
...     columns=sales_data["sales_region"],
...     margins=True,
...     margins_name="Totals",
...     normalize=True,
... )
sales_region                Central East N Central East \
job_title
Sales Associate                    0.00%          2.57%
Sales Associate I                  0.00%          0.00%
Sales Associate II                 2.71%          0.00%
Sales Associate III                0.00%          0.00%
...
Totals                            13.59%         16.22%

N Central West  ... Southeast Southwest  Totals
                ...
         0.00%  ...     0.00%     2.69%    6.96%
         1.36%  ...     3.80%     4.95%   18.11%
         0.00%  ...     0.00%     1.85%   14.17%
         0.00%  ...     4.50%     0.00%    6.98%
                ...
         1.36%  ...    13.53%    14.25%  100.00%

[10 rows x 10 columns]

Dieser Code ist dem vorherigen Beispiel sehr ähnlich, außer dass Sie durch die Festlegung von normalize=True jede Zahl als Prozentsatz der Gesamtsumme berechnet haben. Sie haben auch "{:.2%}" verwendet, um die Ausgabe im herkömmlichen Prozentformat anzuzeigen.

Abschluss

Sie verfügen nun über ein umfassendes Verständnis der Verwendung der Methode .pivot_table(), ihrer Kernparameter und ihrer Verwendung zur Strukturierung von Pivot-Tabellen. Am wichtigsten ist, dass Sie gelernt haben, wie wichtig es ist, vor der Umsetzung zu überlegen, was Sie erreichen möchten.

Sie haben außerdem gelernt, wie Sie mit den Hauptparametern der Methode DataFrame.pivot_table() eine Pivot-Tabelle erstellen und wie einige Parameter eine detailliertere Analyse mit Wertelisten anstelle von Einzelwerten erstellen können. Um Ihr Wissen über .pivot_table() abzurunden, haben Sie gelernt, wie Sie Pivot-Tabellen erstellen, die mehrere Aggregationen, spaltenspezifische Aggregationen und sogar benutzerdefinierte Aggregationen durchführen.

Außerdem wurden Ihnen zwei weitere Möglichkeiten zur Aggregation von Daten mithilfe von .groupby() und crossstab() vorgestellt, die Sie selbst weiter untersuchen können, um Ihr Wissen noch weiter zu erweitern . Jetzt können Sie sicher interessante und komplexe Datenansichten erstellen, um die darin enthaltenen Erkenntnisse offenzulegen.

Herzlichen Glückwunsch zum Abschluss dieses Tutorials und viel Spaß beim Anwenden dieser neu erworbenen Fähigkeiten auf Ihre zukünftigen Datenanalyseprojekte!