Gruppierung und Aggregation mit pandas

Lerne, einen pandas-DataFrame in Gruppen aufzuteilen und jede Gruppe zusammenzufassen. Gruppiere nach Spalten, abgeleiteten Schlüsseln und Indexebenen; berechne integrierte, mehrfache und benutzerdefinierte Aggregationen; ergänze mit transform jede Zeile um Gruppenkennwerte; vergib Ränge, filtere und ziehe Stichproben innerhalb von Gruppen; und nutze apply für alles Weitere. Teile anschließend Zahlen mit cut und qcut für Quantilanalysen in Klassen ein und erstelle Pivot-Tabellen und Kreuztabellen mit Summen und Prozentwerten.

MittelEinheit 5 von 8 in Kurs: Datenanalyse mit Python – NumPy, pandas und Matplotlib

Was du lernst

  1. Erkläre das Split-Apply-Combine-Muster, erstelle GroupBy-Objekte aus verschiedenen Arten von Schlüsseln und steuere, wie das gruppierte Ergebnis beschriftet, geordnet und vervollständigt wird.
    • Split-Apply-Combine und das GroupBy-Objekt erklären
      Beschreibe, was geschieht, wenn pandas einen DataFrame gruppiert, untersuche die gebildeten Gruppen und wähle die zusammenzufassenden Spalten aus.
    • Nach Spalten, Arrays, Zuordnungen, Funktionen und Indexebenen gruppieren
      Wähle und kombiniere Gruppierungsschlüssel: von einer oder mehreren Spalten bis hin zu abgeleiteten Schlüsseln, Zuordnungen, Funktionen und Indexebenen.
    • Gruppenschlüssel, Reihenfolge und fehlende Schlüssel in Ergebnissen steuern
      Gestalte gruppierte Ergebnisse für die weitere Arbeit: Schlüssel als Index oder Spalten, sortierte Ausgabe, fehlende Schlüssel und unbenutzte Kategorien sowie klare Namen.
  2. Reduziere jede Gruppe mit integrierten Aggregationen, mehreren Aggregationen in einem Aufruf und benutzerdefinierten Funktionen auf zusammenfassende Werte und interpretiere die Ergebnisse korrekt.
    • Integrierte Aggregationsmethoden korrekt nutzen
      Berechne Anzahlen, Summen, Mittelwerte, Streuungsmaße und weitere Kennwerte pro Gruppe und erfahre, wie die Methoden fehlende Werte und Textspalten behandeln.
    • Mit agg mehrere Aggregationen gleichzeitig anwenden
      Nutze agg mit Listen, Dictionaries und benannter Aggregation, um Aggregationstabellen mit klaren Spaltennamen zu erstellen.
    • Eigene Aggregationsfunktionen schreiben
      Schreibe eigene Funktionen, die eine Gruppe auf einen Wert reduzieren, benenne ihre Ergebnisse und erkenne, wann eine integrierte Funktion oder ein Verhältnis von Summen besser geeignet ist.
  3. Ergänze jede Zeile um Gruppenergebnisse, berechne kumulative und relative Werte innerhalb von Gruppen, behalte Gruppen und Zeilen oder ziehe daraus Stichproben und nutze apply für Operationen, die sich mit den anderen Methoden nicht ausdrücken lassen.
    • Mit transform jede Zeile um Gruppenkennwerte ergänzen
      Nutze transform, um Gruppenergebnisse auf die ursprünglichen Zeilen zu übertragen und damit Anteile, Abweichungen und standardisierte Werte zu berechnen sowie fehlende Daten gruppenbasiert aufzufüllen.
    • Kumulative Summen, Ränge und Änderungen innerhalb von Gruppen berechnen
      Nutze Methoden für kumulative Werte, Rangvergabe und Verschiebungen, die in jeder Gruppe neu beginnen, und halte die Zeilen in der gewünschten Reihenfolge.
    • Zeilen gruppenweise behalten, entfernen oder als Stichprobe ziehen
      Filtere ganze Gruppen nach einer Bedingung, wähle die ersten, letzten oder größten Zeilen jeder Gruppe aus und ziehe Zufallsstichproben innerhalb der Gruppen.
    • Allgemeine Gruppenoperationen mit apply ausführen
      Nutze apply für Gruppenoperationen, die mehrere Spalten benötigen oder Tabellen zurückgeben, sage die Form des Ergebnisses voraus und bevorzuge schnellere Methoden, wenn sie passen.
  4. Wandle numerische Werte mit cut und qcut in Intervallkategorien um, berechne Quantile und verwende die Klassen als Gruppierungsschlüssel für klassenbasierte Analysen und Quantilanalysen.
    • Werte mit cut in Intervalle einteilen
      Nutze cut mit ausdrücklich angegebenen Klassengrenzen oder einer Anzahl gleich breiter Klassen, lies Intervallschreibweisen und steuere Grenzen, Bezeichnungen und Werte außerhalb der Klassen.
    • Mit Quantilen und qcut Klassen gleicher Besetzungszahl bilden
      Berechne Quantile, erstelle mit qcut quantilbasierte Klassen, vergleiche sie mit Klassen gleicher Breite und berücksichtige gleiche Werte.
    • Durch Klassen und Quantile definierte Gruppen vergleichen
      Nutze die Ausgabe von cut und qcut als Gruppierungsschlüssel für klassenbasierte Analysen und Quantilanalysen, behalte bei Bedarf leere Klassen und interpretiere die Ergebnisse sorgfältig.
  5. Erstelle zweidimensionale Aggregationstabellen mit pivot_table und crosstab, füge Summen hinzu, wandle Anzahlen in Anteile um und wähle die Tabelle, die die Frage beantwortet.
    • Pivot-Tabellen mit pivot_table erstellen
      Fasse Werte mit pivot_table nach Zeilen- und Spaltenschlüsseln zusammen, wähle die Aggregationsfunktion und füge Füllwerte und Summen hinzu.
    • Mit crosstab Kategorien auszählen und vergleichen
      Erstelle mit crosstab Häufigkeitstabellen zweier kategorialer Variablen, füge Summen hinzu, wandle Anzahlen in Zeilen-, Spalten- oder Gesamtanteile um und wähle den Anteil, der die Frage beantwortet.

Gruppierung und Aggregation mit pandas einfach erklärt

5 Kapitel

1

Daten mit groupby in Gruppen aufteilen

Eine gruppierte Analyse beginnt mit einer Frage wie „Wie viele Einheiten hat jede Region verkauft?“. Du wählst die Schlüssel, die eine Gruppe definieren, wählst die zu analysierenden Werte aus und entscheidest, welche Form die Antwort haben soll. Dieselben Zeilen können regionale Summen, Produktvergleiche oder Kombinationen aus beidem liefern. Wenn du Schlüssel, Indizes und fehlende Kategorien verstehst, kannst du diese Ergebnisse leichter untersuchen und in einem Bericht verwenden.

1.1 Split-Apply-Combine und das GroupBy-Objekt erklären

Eine Gruppe enthält Zeilen mit demselben Schlüsselwert. Ist der Schlüssel region, gehört jede Bestellung aus North zu einer Gruppe, auch wenn diese Bestellungen über die Tabelle verstreut sind. Split-Apply-Combine bedeutet, diese Gruppen zu bestimmen, innerhalb jeder Gruppe dieselbe Operation auszuführen und die Ergebnisse zusammenzuführen.

Beginne mit den Bestelldaten

Die Beispiele verwenden pandas 3 mit import pandas as pd und NumPy als np. Erstelle die Tabelle mit Getränkebestellungen:

sales = pd.DataFrame({
    "region": ["North", "South", "North", "East", "South", "East", "North", "South"],
    "product": ["tea", "tea", "coffee", "coffee", "coffee", "tea", "tea", "coffee"],
    "units": [10, 4, 7, 5, 9, 3, 6, 8],
    "revenue": [30, 12, 28, 20, 36, 9, 18, 32]
})

Der Umsatz hat hier keine Währungseinheit. Tee erzielt einen Umsatz von 3 pro Einheit und Kaffee von 4 pro Einheit. Die standardmäßigen Zeilenbezeichnungen reichen von 0 bis 7.

Vom GroupBy-Objekt zur Antwort

sales.groupby("region") gibt ein GroupBy-Objekt zurück, das die Gruppierungsinformationen enthält. Es ist keine Aggregationstabelle. Wähle eine Spalte und rufe eine Methode auf, um ein Ergebnis zu berechnen:

g = sales.groupby("region")
totals = g["units"].sum()

East enthält die Zeilen 3 und 5, die Summe ist also 5 + 3 = 8. North enthält die Zeilen 0, 2 und 6, was 10 + 7 + 6 = 23 ergibt. South enthält die Zeilen 1, 4 und 7, was 4 + 9 + 8 = 21 ergibt. pandas fasst diese Werte in einer Series namens units mit den Regionsnamen als Index zusammen. Die Summen ergeben zusammen 52, die ursprüngliche Spaltensumme.

Die standardmäßige Ausgabereihenfolge ist East, North, South, weil die Gruppenschlüssel sortiert werden. sales.groupby("region", sort=False) verwendet die Reihenfolge des ersten Auftretens: North, South, East. Keine der beiden Varianten sortiert die Beobachtungen innerhalb einer Gruppe oder verändert sales.

Untersuchen und auswählen

g.ngroups ist 3. g.size() meldet 2, 3 und 3 Zeilen für East, North und South. g.groups ordnet Schlüsseln Zeilenbezeichnungen zu und g.get_group("North") gibt die drei Zeilen von North zurück. Du kannst jeweils eine Gruppe untersuchen:

for name, group in g:
    print(name, group["units"].tolist())

Iteration hilft beim Untersuchen oder Exportieren von Gruppen. Für einen Kennwert erspart dir eine integrierte Gruppenmethode, selbst eine Python-Schleife zu schreiben und die Ergebnisse zu sammeln.

Die Auswahl g["units"] erzeugt ein SeriesGroupBy; seine Summe ist eine Series. Die Auswahl g[["units"]] erzeugt ein DataFrameGroupBy; seine Summe ist ein DataFrame mit einer Spalte. Wähle g[["units", "revenue"]], wenn beide numerischen Spalten benötigt werden.

Wähle die Form der Ausgabe

Eine Aggregation wie sum liefert einen zusammenfassenden Wert pro Gruppe und Spalte. Eine Transformation liefert einen Wert für jede Eingabezeile, etwa den Anteil jeder Bestellung an der Summe ihrer Region. Eine Filterung behält ausgewählte Zeilen oder Gruppen. Die allgemeine Methode apply verarbeitet weniger regelmäßige Gruppenergebnisse.

Der Filter sales[sales["region"] == "North"] ruft die Zeilen einer Region ab. Mit einer Gruppierung kannst du jede Region mit derselben Operation verarbeiten.

Wichtige Erkenntnisse

  • Gruppenschlüssel bestimmen, welche Zeilen zusammengehören.
  • Ein GroupBy-Objekt benötigt eine Operation, bevor es ein Ergebnis erzeugt.
  • Wähle Aggregation, Transformation oder Filterung anhand der benötigten Ausgabe.
  • Die Gruppierung erhält die ursprüngliche Tabelle und die Zeilenreihenfolge innerhalb jeder Gruppe.

1.2 Nach Spalten, Arrays, Zuordnungen, Funktionen und Indexebenen gruppieren

Schlüssel können aus Spalten, Berechnungen oder dem Zeilenindex stammen. Entscheidend ist, welchen Wert jede Zeile als Schlüssel erhält. Zeilen mit derselben Schlüsselkombination werden gemeinsam verarbeitet.

Mehrere Spalten verwenden

Übergib eine Liste von Spaltennamen, um nach Kombinationen zu gruppieren:

pair_totals = sales.groupby(["region", "product"])["units"].sum()

Das Ergebnis hat einen zweistufigen MultiIndex. Seine Einträge sind East–coffee 5, East–tea 3, North–coffee 7, North–tea 16, South–coffee 17 und South–tea 4. North–tea fasst die beiden Teebestellungen mit 10 und 6 Einheiten zusammen. Eine Gruppierung allein nach Region würde auch die Kaffeebestellung aus North einbeziehen.

pair_totals.unstack() verschiebt die innere Ebene product in die Spalten. Die Zeilen sind Regionen und die Spalten coffee und tea. Eine nicht vorhandene Kombination wird zu NaN; unstack(fill_value=0) kann sie als null darstellen, wenn das Fehlen bedeutet, dass keine Einheiten vorliegen.

Verwende für mehrere Spaltennamen eine Liste. groupby(("region", "product")) behandelt das Tupel als eine einzelne Spaltenbezeichnung und sucht nach einer Spalte mit diesem Tupel als Namen.

Einen Schlüssel aus Werten ableiten

Eine boolesche Series kann Bestellungen nach Größe aufteilen, ohne eine Spalte hinzuzufügen:

sales.groupby(sales["units"] >= 7)["revenue"].sum()

Die Gruppe True enthält die Einheiten 10, 7, 9 und 8; ihr Umsatz beträgt 126. Die Gruppe False enthält die anderen vier Bestellungen und hat einen Umsatz von 59. Der Vergleich erzeugt Gruppenbezeichnungen; er entfernt die kleineren Bestellungen nicht.

Eine Zuordnung kann Regionen zu Zonen zusammenfassen:

zones = {"North": "Zone 1", "East": "Zone 1", "South": "Zone 2"}
zone_key = sales["region"].map(zones)
sales.groupby(zone_key)["units"].sum()

Zone 1 erhält die 23 Einheiten von North und die 8 Einheiten von East, zusammen 31. Zone 2 erhält die 21 Einheiten von South. Ordne zuerst die Spalte zu: Ein direkt an groupby übergebenes Dictionary ordnet Indexbezeichnungen zu, nicht Regionswerte.

Mit dem Index gruppieren

Auch eine als Schlüssel übergebene Funktion erhält Indexbezeichnungen. Bei einem Bestand mit Produktcodes als Index kann der erste Buchstabe die Produktfamilie bezeichnen:

stock = pd.Series([12, 8, 5, 9, 4],
                  index=["T01", "T02", "C01", "C02", "C03"])
stock.groupby(lambda code: code[0]).sum()

Die Summe für C ist 18 und die für T ist 20. Bei einem vorhandenen MultiIndex gruppiert pair_totals.groupby(level="product").sum() erneut nach der benannten Indexebene und ergibt coffee 29 und tea 23.

Vor dem Gruppieren die Ausrichtung prüfen

Ein NumPy-Array als Schlüssel liefert Bezeichnungen nach Position und muss ein Element pro Zeile haben. Eine Series als Schlüssel wird anhand der Indexbezeichnung ausgerichtet. Decken ihre Bezeichnungen nur die Zeilen 0 und 1 ab, erhalten die anderen Zeilen fehlende Schlüssel und werden beim standardmäßigen Gruppieren ausgelassen. Eine anders angeordnete Series kann trotzdem korrekt gruppieren, wenn ihre Bezeichnungen übereinstimmen; ersetzt du sie durch ihre Werte, erfolgt die Zuordnung nach Position.

Wichtige Erkenntnisse

  • Verwende eine Liste von Spaltennamen, um nach Kombinationen zu gruppieren.
  • Eine Series als Schlüssel wird anhand der Indexbezeichnung ausgerichtet; ein Array liefert Werte nach Position.
  • Ordne Spaltenwerte vor dem Gruppieren zu, wenn ein Dictionary diese Werte beschreibt.
  • Als Schlüssel übergebene Funktionen erhalten Indexbezeichnungen.
  • Verwende level für Indexebenen und unstack, um eine Indexebene in die Spalten zu verschieben.
  • Ein boolescher Schlüssel teilt Zeilen anhand einer Bedingung in Gruppen auf, ohne eine der Gruppen zu entfernen.

1.3 Gruppenschlüssel, Reihenfolge und fehlende Schlüssel in Ergebnissen steuern

Bei einer gruppierten Berechnung gibt es zwei Bestandteile zu prüfen: die Werte und die zugehörigen Bezeichnungen. In pandas kannst du wählen, wo Schlüssel erscheinen, wie Gruppen geordnet werden und ob fehlende oder unbenutzte Schlüssel im Bericht erscheinen.

Schlüssel im Index oder in Spalten behalten

Standardmäßig werden Schlüssel zum Index des Ergebnisses:

sales.groupby("region")["revenue"].sum()

Diese Series enthält East 29, North 76 und South 80. Für einen flachen Bericht verwende:

report = sales.groupby("region", as_index=False)["revenue"].sum()

report hat normale Spalten region und revenue sowie einen neuen ganzzahligen Index. Ein Aufruf von .reset_index() auf der ursprünglichen Series erzeugt denselben Aufbau. Bei mehreren Schlüsseln wandelt er jede MultiIndex-Ebene in eine Spalte um. unstack() hat einen anderen Zweck: Es verschiebt eine Indexebene in die Spalten eines Rasters.

Eine Series als Ergebnis behält den Namen der ausgewählten Spalte. Verwende .rename("total_revenue") für einen klareren Series-Namen oder .to_frame("total_revenue") für einen DataFrame mit einer Spalte. Benannte Aggregation kann während der Berechnung beschreibende Spaltennamen vergeben.

Schlüssel sortieren oder Werte in eine Rangfolge bringen

sort=True sortiert die Schlüssel, sodass die alphabetische Reihenfolge der Regionen East, North, South bleibt, obwohl South den größten Umsatz hat. Um Summen in eine Rangfolge zu bringen, sortiere das Ergebnis:

sales.groupby("region")["revenue"].sum().sort_values(ascending=False)

Die Ausgabe lautet South 80, North 76, East 29. Verwende sort=False, um die Schlüssel in der Reihenfolge ihres ersten Auftretens zu behalten und bei einem großen Datensatz unnötiges Sortieren der Schlüssel zu vermeiden. Die Zeilen innerhalb der Gruppen werden dadurch nicht sortiert.

Fehlende Schlüssel berücksichtigen

Die Standardeinstellung dropna=True schließt Zeilen mit fehlendem Gruppenschlüssel aus. Füge eine Bestellung mit 5 Einheiten, aber ohne Region hinzu: Die gesamte Spalte der Einheiten ergibt nun 57, während die Gruppensummen weiterhin zusammen 52 ergeben. Die ausgelassene Zeile hat keine benannte Region.

sales.groupby("region", dropna=False)["units"].sum()

Auf der erweiterten Tabelle fügt dies eine Gruppe für fehlende Schlüssel mit der Summe 5 hinzu. Fehlende Schlüssel bestimmen, ob eine Zeile in eine Gruppe aufgenommen wird; fehlende Werte bestimmen, was eine Aggregation innerhalb einer Gruppe zählt oder berechnet. Das sind getrennte Entscheidungen.

Bei Bedarf unbenutzte Kategorien anzeigen

Eine kategoriale Spalte region kann East, North, South und West aufführen, auch wenn es keine Bestellungen aus West gibt. Seit pandas 3.0 ist observed=True die Standardeinstellung und zeigt nur Kategorien, die in den Daten vorkommen. Mit observed=False erscheint auch West: Summe und Anzahl sind 0, während das arithmetische Mittel NaN ist.

Wähle diese Einstellung ausdrücklich, wenn ein Bericht jedes Mal dieselben Kategorien zeigen muss. Eine unbenutzte Kategorie und ein fehlender Schlüssel sind verschieden: observed behandelt deklarierte kategoriale Werte; dropna behandelt fehlende Schlüsselwerte.

as_index und sort gestalten Aggregationsergebnisse. Transformationen und Filterungen wie head, nth und filter behalten die Indizes der Eingabezeilen. Bei einem Summenbericht kann der Vergleich der Summe der Gruppensummen mit der ursprünglichen Spaltensumme ausgeschlossene Schlüssel oder einen früheren Filter aufdecken.

Wichtige Erkenntnisse

  • as_index=False legt Aggregationsschlüssel in normalen Spalten ab.
  • sort ordnet Schlüssel; sort_values bringt berechnete Werte in eine Rangfolge.
  • dropna=False behält eine Gruppe für fehlende Schlüssel.
  • observed=False schließt unbenutzte kategoriale Werte ein.
2

Jede Gruppe durch Aggregation zusammenfassen

Eine Aggregationstabelle macht aus vielen Beobachtungen wenige nützliche Kennwerte. Anzahlen, Summen, Mittelwerte und Streuungsmaße beantworten unterschiedliche Fragen, selbst wenn sie dieselben Gruppen verwenden. Du wählst geeignete integrierte Funktionen, sammelst mehrere Ergebnisse in einem Aufruf und schreibst bei Bedarf eine eigene Funktion. Fehlende Werte und ungleiche Gruppengrößen sind wichtig: Auch eine übersichtliche Tabelle kann die falsche Frage beantworten.

2.1 Integrierte Aggregationsmethoden korrekt nutzen

Eine Aggregation reduziert jede Gruppe auf einen zusammenfassenden Wert für jede ausgewählte Spalte. Wähle den Kennwert anhand der Frage: Eine Zeilenanzahl, eine Summe, ein Mittelwert und ein Streuungsmaß beschreiben unterschiedliche Merkmale der Daten.

Den Kennwert auswählen

Zu den häufig verwendeten Methoden gehören sum, prod, mean, median, min, max, count, size, nunique, std, var, first, last und quantile. Sowohl ein direkter Aufruf wie .mean() als auch .agg("mean") fordert einen Gruppenmittelwert von pandas an. nunique() zählt standardmäßig unterschiedliche nicht fehlende Werte.

sales.groupby("product")["revenue"].agg(["mean", "median"])

Die Kaffeeumsätze sind 28, 20, 36 und 32. Ihr arithmetisches Mittel ist 29; sortiert ergeben sich die mittleren Werte 28 und 32, der Median ist also 30. Die Teeumsätze sind 30, 12, 9 und 18. Ihr arithmetisches Mittel ist 17,25 und ihr Median 15. Die große Teebestellung von 30 zieht das arithmetische Mittel über den Median.

Zeilen oder erfasste Werte zählen

size() zählt Zeilen. count() zählt die nicht fehlenden Werte jeder ausgewählten Spalte. Fehlen die Einheiten für Zeile 2 von North und Zeile 5 von East, bleiben die Zeilenanzahlen East 2, North 3, South 3, aber die Anzahlen der Einheitenwerte betragen 1, 2 und 3. Verschiedene Spalten können daher innerhalb derselben Gruppe unterschiedliche Anzahlen haben.

Die meisten numerischen Reduktionen überspringen fehlende Werte. Die verbleibenden Einheiten 10 und 6 von North haben das arithmetische Mittel 8, berechnet aus zwei erfassten Werten. Ihre Summe durch alle drei Zeilen zu dividieren, ergäbe den falschen Mittelwert. Eine Gruppe mit ausschließlich fehlenden Werten hat standardmäßig die Summe 0, aber das arithmetische Mittel NaN. Seit pandas 3.0 akzeptieren Reduktionen wie sum und mean das Argument skipna=False, um ein fehlendes Ergebnis zurückzugeben, wenn eine Gruppe einen fehlenden Wert enthält.

Streuung und kombinierte Zusammenfassungen interpretieren

std() und var() verwenden Stichprobenkennwerte mit ddof=1: Der Divisor ist um eins kleiner als die Anzahl der erfassten Beobachtungen. Die Werte 1 und 3 haben eine Stichprobenstandardabweichung von etwa 1,414. Eine Gruppe mit nur dem Wert 5 hat die Stichprobenstandardabweichung NaN.

describe() bündelt Anzahl, arithmetisches Mittel, Standardabweichung, Minimum, Quartile und Maximum. Für die Umsätze 12, 36 und 32 von South ist das arithmetische Mittel etwa 26,67 und der Median 32. Die Spalte 50 % enthält den Median.

Spalten und Zeilenreihenfolge steuern

Durch Auswahl numerischer Spalten vermeidest du den Versuch, Text zu mitteln:

sales.groupby("region")[["units", "revenue"]].mean()

Ein .mean() auf der ganzen Tabelle schlägt an der Textspalte product fehl; numeric_only=True ist eine weitere Lösung. Ein .sum() auf der ganzen Tabelle kann Text verketten und für East "coffeetea" erzeugen, was keine nützliche Produktzusammenfassung ist.

first() und last() wählen den ersten beziehungsweise letzten nicht fehlenden Wert pro Spalte in der aktuellen Zeilenreihenfolge. Dabei können sie Werte aus verschiedenen Zeilen nehmen. Verwende nth(0), um die tatsächliche erste Zeile einschließlich ihrer fehlenden Werte abzurufen; sortiere zuerst, wenn „erste“ die früheste bedeutet.

Ungleiche Gruppengrößen wirken sich auch auf die Interpretation aus. Das arithmetische Mittel der regionalen Umsatzmittelwerte beträgt etwa 22,17, das Gesamtmittel jedoch 185 dividiert durch 8, also 23,125. Wenn jeder regionale Mittelwert gleich gewichtet wird, hat die Gruppe East mit zwei Zeilen genauso viel Einfluss wie jede Gruppe mit drei Zeilen.

Wichtige Erkenntnisse

  • size zählt Zeilen; count zählt erfasste Werte.
  • Die meisten Reduktionen überspringen fehlende Werte; die Summe ausschließlich fehlender Werte ist standardmäßig null.
  • std und var verwenden standardmäßig den Divisor für Stichproben.
  • Wähle vor dem Aggregieren die relevanten numerischen Spalten aus.
  • first kann fehlende Werte überspringen; nth(0) wählt eine tatsächliche Zeile aus.
  • Ungleich große Gruppen benötigen beim Kombinieren ihrer Mittelwerte geeignete Gewichte.

2.2 Mit agg mehrere Aggregationen gleichzeitig anwenden

Ein nützlicher Bericht benötigt oft mehrere Kennwerte aus denselben Gruppen. Mit agg, kurz für aggregate, kannst du diese Kennwerte zusammen anfordern und steuern, wie ihre Ausgabespalten heißen.

Mehrere Funktionen auf eine Spalte anwenden
sales.groupby("region")["revenue"].agg(["sum", "mean", "max"])

East ergibt 29, 14,5 und 20; North ergibt 76, etwa 25,33 und 30; South ergibt 80, etwa 26,67 und 36. Jede Zeile steht für eine Region, während die Funktionsnamen zu Spaltennamen werden.

Eine auf mehrere Wertespalten angewendete Liste erzeugt hierarchische Spalten:

result = sales.groupby("region")[["units", "revenue"]].agg(["sum", "mean"])

Die vier Spaltenbezeichnungen sind die Paare ("units", "sum"), ("units", "mean"), ("revenue", "sum") und ("revenue", "mean"). Die erste Ebene bezeichnet die Eingabespalte, die zweite die Berechnung. Dies sind Spaltenebenen, getrennt von etwaigen Gruppierungsebenen im Zeilenindex.

Bestimmten Spalten Funktionen zuweisen

Ein Dictionary wählt die Eingabespalten und ihre Funktionen aus:

sales.groupby("region").agg({
    "units": "sum",
    "revenue": ["mean", "max"]
})

Dies fordert die Summe der Einheiten, aber den durchschnittlichen und den maximalen Umsatz an. Spalten, die im Dictionary fehlen, erscheinen nicht. Für unterschiedliche Größen können unterschiedliche Funktionen sinnvoll sein; eine Menge zu summieren und eine Rate zu mitteln sind keine austauschbaren Entscheidungen.

Ausgaben direkt benennen

Benannte Aggregation gibt jedem Ergebnis einen ausdrücklichen Namen:

report = sales.groupby("region").agg(
    total_units=("units", "sum"),
    avg_revenue=("revenue", "mean")
)

Jedes Schlüsselwort benennt eine Ausgabespalte. Sein Tupel enthält die Quellspalte und die Funktion. total_units ist 8, 23 und 21; avg_revenue ist 14,5, etwa 25,33 und etwa 26,67. pd.NamedAgg(column="units", aggfunc="sum") ist eine alternative Hilfskonstruktion zur Angabe von Quelle und Funktion.

Nach Auswahl einer einzelnen Series verwendest du Funktionsschlüsselwörter ohne Tupel mit Quellspalten:

sales.groupby("region")["units"].agg(total="sum", most="max")

Die Summen sind 8, 23 und 21 und die Maxima 5, 10 und 9. Ein Dictionary wie {"total": "sum"} auf dieser ausgewählten Series löst einen SpecificationError aus; es ist nicht die Dictionary-Form, die bei einem DataFrame verwendet wird.

Eine Liste benannter Paare funktioniert ebenfalls auf einer ausgewählten Spalte: .agg([("average", "mean"), ("spread", "std")]). Hast du bereits MultiIndex-Spalten aus Zeichenketten als Bezeichnungen, flacht result.columns = ["_".join(col) for col in result.columns] sie ab und erzeugt Namen wie units_sum.

Die Funktion bewusst wählen

Zeichenketten als Namen nutzen die integrierten Gruppenberechnungen von pandas. Seit pandas 3.0 wird eine an agg übergebene NumPy- oder Python-Funktion wie angegeben aufgerufen. Für die Umsätze 20 und 9 von East verwendet "std" den Divisor für Stichproben und ergibt etwa 7,78, während np.std den Divisor für Grundgesamtheiten verwendet und 5,5 ergibt.

Wichtige Erkenntnisse

  • Eine Liste wendet mehrere Funktionen auf die ausgewählten Spalten an.
  • Ein Dictionary weist bestimmten Eingabespalten Funktionen zu.
  • Benannte Aggregation verwendet Ausgabenamen mit Paaren (column, function).
  • Funktionsnamen als Zeichenketten und aufrufbare NumPy-Objekte können unterschiedliche statistische Voreinstellungen verwenden.

2.3 Eigene Aggregationsfunktionen schreiben

Eine benutzerdefinierte Aggregation beschreibt eine Zusammenfassung, für die es keinen integrierten Namen gibt. Ihre Funktion erhält die Werte einer Gruppe als Series und sollte sie auf ein nützliches Ergebnis reduzieren.

Die Funktion schreiben und übergeben
def value_range(s):
    return s.max() - s.min()

sales.groupby("region")["revenue"].agg(value_range)

Die Spannweite von East ist 20 minus 9, also 11. Die von North ist 30 minus 18, also 12. Die von South ist 36 minus 12, also 24. Übergib value_range selbst; value_range() würde die Funktion sofort aufrufen, ohne die benötigte Gruppen-Series zu übergeben.

Für eine kurze Berechnung eignet sich ein Lambda-Ausdruck:

sales.groupby("region")["revenue"].agg(
    share_20=lambda s: (s >= 20).mean()
)

Boolesche Werte wirken als 1 für True und 0 für False, sodass ihr arithmetisches Mittel der Anteil ist, der die Bedingung erfüllt. East hat eine passende Bestellung von zwei, also 0,5. North und South haben jeweils zwei von drei, also etwa 0,667. Ein Name für das Ergebnis macht seine Bedeutung klarer als eine automatische Bezeichnung für den Lambda-Ausdruck. Listen mit mehreren Funktionen bezeichnen Lambda-Ausdrücke als <lambda_0>, <lambda_1> und so weiter; ein einzelner Lambda-Ausdruck in einer Liste wird als <lambda> bezeichnet.

Spalten für schnelle Reduktionen vorbereiten

Eine Python-Funktion wird einmal für jede Gruppe ausgeführt. Bei vielen Gruppen sind integrierte Reduktionen gewöhnlich schneller. Die Anteilsberechnung lässt sich umschreiben, indem zuerst ihre boolesche Spalte erstellt wird:

sales.assign(big=sales["revenue"] >= 20).groupby("region")["big"].mean()

Der Vergleich wird auf der gesamten Spalte ausgeführt; pandas berechnet anschließend die Gruppenmittelwerte.

Zwei Spalten über ihre Summen kombinieren

Eine Funktion in agg verarbeitet jeweils eine Spalte. Für den durchschnittlichen Umsatz pro Einheit fasse zuerst beide Spalten zusammen:

totals = sales.groupby("region")[["units", "revenue"]].sum()
avg_price = totals["revenue"] / totals["units"]

Die Ergebnisse sind East 29/8 = 3,625, North 76/23 ≈ 3,304 und South 80/21 ≈ 3,810. Jede Einheit erhält dasselbe Gewicht. Bildest du stattdessen das arithmetische Mittel der Bestellpreise, ergibt das East 3,5, North etwa 3,333 und South etwa 3,667, weil jede Bestellung unabhängig von ihrer Größe gleich gewichtet wird. Entscheide vor der Wahl der Formel, ob sich die Frage auf eine typische Einheit oder eine typische Bestellung bezieht.

Rückgabewert und fehlende Daten klar berücksichtigen

Eine Funktion, die die zwei kleinsten Werte zurückgibt, erzeugt über agg keine zwei normalen zusammenfassenden Zeilen; in pandas 3.1 speichert lambda s: s.nsmallest(2) ein listenartiges Objekt in jeder Zelle. Verwende apply, wenn eine Gruppe mehrere Werte oder Zeilen zurückgeben muss.

Die Eingabe-Series enthält weiterhin fehlende Werte. s.mean() überspringt sie, während len(s) ihre Zeilen zählt. Fehlen die Einheiten in den Zeilen 2 und 5, ergibt .agg(len) die Gruppengrößen 2, 3 und 3, nicht die Anzahlen nicht fehlender Werte 1, 2 und 3.

Zusätzliche Argumente können auf die Funktion folgen: .agg("quantile", 0.9) ergibt das 90. Perzentil jeder Gruppe. Die Umsätze 9 und 20 von East ergeben durch lineare Interpolation 18,9. Der direkte Aufruf .quantile(0.9) ist für diese einzelne Operation leichter zu lesen.

Wichtige Erkenntnisse

  • Übergib eine Funktion an agg, ohne sie vorher aufzurufen.
  • Eine benutzerdefinierte Aggregation erhält die Series einer Gruppe und sollte einen zusammenfassenden Wert zurückgeben.
  • Mittelwerte boolescher Werte ergeben Anteile.
  • Ein Verhältnis von Summen gewichtet Einheiten anders als ein arithmetisches Mittel der Verhältnisse auf Zeilenebene.
  • Bevorzuge integrierte Reduktionen, wenn sie die Berechnung ausdrücken.
  • Benutzerdefinierte Funktionen müssen fehlende Werte bewusst behandeln.
3

Gruppenweise transformieren, filtern und Funktionen anwenden

Eine Gruppe kann für jede ursprüngliche Zeile Kontext liefern, nicht nur eine separate Zusammenfassung. Eine Bestellung kann die Summe ihrer Region, ihren Rang oder die Änderung gegenüber der vorherigen Bestellung dieser Region erhalten. Andere Aufgaben behalten ausgewählte Gruppen oder geben eine Tabelle aus jeder Gruppe zurück. Wenn du eine Methode anhand der Form ihrer Ausgabe wählst, wird diese Arbeit klarer und du vermeidest Fehler bei der Indexausrichtung, wenn du ein Ergebnis wieder zu den ursprünglichen Daten hinzufügst.

3.1 Mit transform jede Zeile um Gruppenkennwerte ergänzen

Eine Zusammenfassung hat eine Zeile pro Gruppe, doch manchmal benötigt jede ursprüngliche Zeile den Kennwert ihrer Gruppe. transform gibt ein Ergebnis mit der ursprünglichen Länge und dem ursprünglichen Index zurück und eignet sich damit für eine neue Spalte.

Eine Summe auf die richtigen Zeilen übertragen
g = sales.groupby("region")["revenue"]
regional_total = g.transform("sum")
sales["share"] = sales["revenue"] / regional_total

Die Series mit den Summen enthält in der ursprünglichen Zeilenreihenfolge 76, 80, 76, 29, 80, 29, 76 und 80. Die Summe 76 von North wird nur in den Zeilen von North wiederholt. Zeile 0 erhält einen Anteil von 30/76 ≈ 0,395; Zeile 3 von East erhält 20/29 ≈ 0,690. Innerhalb jeder Region ergeben diese Umsatzanteile zusammen 1.

Eine direkte Zuweisung von g.sum() würde nicht zu den Zeilen passen. Sein Index enthält Regionsnamen, während sales die Zeilenbezeichnungen 0 bis 7 hat. pandas richtet anhand der Indexbezeichnung aus, sodass die zugewiesene Spalte fehlende Werte enthält. Verwende entweder transform oder verknüpfe eine Zusammenfassung ausdrücklich über region.

Eine Zeile mit ihrer Gruppe vergleichen

Die Subtraktion des Gruppenmittelwerts ergibt eine Abweichung vom Gruppenmittelwert:

x = sales["revenue"]
deviation = x - g.transform("mean")

Zeile 0 von North liegt etwa 4,67 über dem Gruppenmittelwert von etwa 25,33. Zeile 1 von South liegt etwa 14,67 unter dem Gruppenmittelwert von etwa 26,67. Jeder Vergleich bezieht sich auf die eigene Region der Zeile, nicht auf den Durchschnitt der ganzen Tabelle.

Ein z-Wert dividiert diese Abweichung durch die Standardabweichung der Gruppe:

z = (x - g.transform("mean")) / g.transform("std")

Für Zeile 0 von North beträgt die Stichprobenstandardabweichung etwa 6,43 und der z-Wert etwa 0,73. Zeile 3 von East hat einen z-Wert von etwa 0,71 und liegt damit über dem Durchschnitt ihrer Region, obwohl ihr Umsatz von 20 unter dem Gesamtdurchschnitt von 23,125 liegt. Bei einer Standardabweichung von null oder zu wenigen erfassten Werten ist ein standardisierter Wert nicht definiert.

Einen fehlenden Wert aus seiner Gruppe auffüllen

Angenommen, die Einheiten in den Zeilen 2 und 5 fehlen. Die erfassten Einheiten von North sind 10 und 6 mit dem Mittelwert 8; der einzige erfasste Einheitenwert von East ist 5.

with_missing = sales.copy()
with_missing.loc[[2, 5], "units"] = np.nan
means = with_missing.groupby("region")["units"].transform("mean")
filled_units = with_missing["units"].fillna(means)

In dieser veränderten Tabelle erhält Zeile 2 den Wert 8 und Zeile 5 den Wert 5. Vorhandene Werte bleiben unverändert. Wenn Gruppen unterschiedliche typische Werte haben, können ihre eigenen Mittelwerte realistischere Ersatzwerte liefern als ein einziges Gesamtmittel. Eine Gruppe ohne erfasste Werte hat weiterhin keinen Mittelwert, den sie liefern könnte.

Eine benutzerdefinierte Transformation verstehen

Eine an transform übergebene Funktion kann einen Skalar zurückgeben, den pandas innerhalb der Gruppe wiederholt, oder eine Series mit den Zeilen der Gruppe als Index. Beispielsweise berechnet g.transform(lambda s: s - s.mean()) dieselben Abweichungen wie der integrierte Mittelwert mit anschließender Subtraktion, ruft aber für jede Gruppe Python auf.

Eine kürzere zurückgegebene Series wird anhand der Bezeichnung zugeordnet. g.transform(lambda s: s.head(1)) liefert nur den Wert der ersten Zeile jeder Gruppe; die anderen Zeilen erhalten NaN. Behalte bei Berechnungen auf Zeilenebene den ursprünglichen Index bei, wenn das Ergebnis wieder der Tabelle zugewiesen werden soll.

Wichtige Erkenntnisse

  • transform gibt Ergebnisse zurück, die an den Eingabezeilen ausgerichtet sind.
  • Dividiere jeden Wert durch seine übertragene Gruppensumme, um Anteile innerhalb der Gruppe zu erhalten.
  • Verwende Gruppenmittelwerte und Standardabweichungen für Vergleiche innerhalb von Gruppen.
  • Das gruppenbasierte Auffüllen nutzt den Kennwert der Gruppe, zu der die Zeile mit dem fehlenden Wert gehört.

3.2 Kumulative Summen, Ränge und Änderungen innerhalb von Gruppen berechnen

Kumulative Berechnungen und Vergleiche mit vorherigen Beobachtungen benötigen sowohl eine Gruppe als auch eine Zeilenreihenfolge. Die Gruppierung verhindert, dass eine Berechnung in eine andere Gruppe übergreift; die Sortierung bestimmt, was „vorherig“ oder „bisher“ bedeutet.

Innerhalb jeder Gruppe kumulieren

Angenommen, die Bestellzeilen sind bereits zeitlich geordnet:

sales["running_units"] = sales.groupby("region")["units"].cumsum()

Die Einheiten 10, 7 und 6 von North ergeben die kumulativen Summen 10, 17 und 23. Die Werte 4, 9 und 8 von South ergeben 4, 13 und 21. Die Werte 5 und 3 von East ergeben 5 und 8. Diese Werte bleiben ihren ursprünglichen Zeilenbezeichnungen zugeordnet, sodass die vollständige Ausgabe in Zeilenreihenfolge 10, 4, 17, 5, 13, 8, 23 und 21 lautet.

Ohne groupby würde sales["units"].cumsum() eine kumulative Summe über alle Bestellungen ergeben: 10, 14, 21, 26, 35, 38, 44 und 52. Die gruppierte Berechnung beginnt für jede Region neu. Verwandte Methoden sind cumprod, cummax und cummin für kumulative Produkte, Maxima und Minima.

cumcount() zählt Positionen innerhalb von Gruppen ab null. Hier ergibt das 0, 0, 1, 0, 1, 1, 2 und 2. Addiere 1 für die erste, zweite und dritte Bestellnummer innerhalb jeder Region.

Werte in eine Rangfolge bringen, ohne Zeilen umzuordnen
sales.groupby("region")["revenue"].rank(ascending=False)

Der größte Umsatz erhält Rang 1 in seiner jeweiligen Region: Zeile 0 von North, Zeile 4 von South und Zeile 3 von East. Die Ausgabe behält den Eingabeindex; die Rangvergabe verschiebt die Zeilen mit den größten Werten nicht an den Anfang der Tabelle.

Standardmäßig erhalten gleiche Werte den Durchschnitt ihrer Ränge. Liegen zwei Werte gemeinsam auf dem ersten Platz, erhalten beide 1,5 und der nächste erhält 3. method="min" gibt den gleichen Werten 1 und dem nächsten weiterhin 3. method="dense" gibt den gleichen Werten 1 und dem nächsten 2. Wähle eine Regel für Rangbindungen, die zur Interpretation der Ränge passt.

Aufeinanderfolgende Werte vergleichen
g = sales.groupby("region")["units"]
previous = g.shift(1)
change = g.diff()
relative_change = g.pct_change()

Die vorherigen Werte von North sind fehlend, 10 und 7. Die Differenzen sind fehlend, −3 und −1. Die relativen Änderungen sind fehlend, −0,3 und etwa −0,143: Die Differenz wird durch den vorherigen Wert dividiert. pct_change() gibt einen Bruchteil zurück, sodass −0,3 eine Abnahme um 30 % bedeutet, nicht um 0,3 %.

Die erste Beobachtung jeder Gruppe hat keine vorherige Beobachtung und erhält NaN. Ein einfaches shift() auf einer Spalte würde die vorherige Zeile der gesamten Tabelle verwenden, die zu einer anderen Region gehören könnte.

Sortiere vor diesen reihenfolgeabhängigen Berechnungen die Zeilen nach der Spalte, die die Abfolge bestimmt, etwa einem Datum oder einer Ereignisnummer. groupby(sort=True) sortiert nur Gruppenschlüssel; es kann Beobachtungen nicht in zeitliche Reihenfolge bringen. Die Rangvergabe vergleicht Werte und behandelt Rangbindungen unabhängig von der zeitlichen Reihenfolge, während kumulative Berechnungen und Berechnungen mit verzögerten Werten von der gewählten Abfolge abhängen.

Wichtige Erkenntnisse

  • Sortiere Beobachtungen vor Berechnungen, die von ihrer Reihenfolge abhängen.
  • Gruppierte kumulative Methoden beginnen innerhalb jeder Gruppe neu.
  • cumcount beginnt bei null; addiere 1 für übliche laufende Nummern.
  • Wähle bei Bedarf die Rangrichtung und die Methode für Rangbindungen ausdrücklich.
  • shift, diff und pct_change vergleichen Beobachtungen innerhalb derselben Gruppe.
  • pct_change gibt einen Bruchteil zurück, der für eine Prozentangabe mit 100 multipliziert werden kann.

3.3 Zeilen gruppenweise behalten, entfernen oder als Stichprobe ziehen

Eine Gruppe zu behalten und sie zusammenzufassen sind unterschiedliche Operationen. Ein Gruppenfilter entscheidet anhand einer Bedingung für die gesamte Gruppe, welche ursprünglichen Zeilen bleiben; Methoden zur Zeilenauswahl wählen bestimmte Beobachtungen aus jeder Gruppe.

Ganze Gruppen behalten
sales.groupby("region").filter(lambda g: len(g) >= 3)

North und South haben je drei Bestellungen, East hingegen zwei. Das Ergebnis enthält die Zeilen 0, 1, 2, 4, 6 und 7 in ursprünglicher Reihenfolge mit ihren ursprünglichen Bezeichnungen. Es gibt keine zwei regionalen Zusammenfassungszeilen zurück.

Die Bedingung muss für jede Gruppe einen booleschen Wert ergeben. lambda g: g["units"] > 5 erzeugt eine boolesche Series und ist für filter unzulässig. Reduziere diese Bedingung mit all() oder any():

sales.groupby("region").filter(lambda g: (g["units"] > 5).all())

Nur North erfüllt die Bedingung, weil alle Einheitenwerte 10, 7 und 6 größer als 5 sind. Mit any() bleibt auch South erhalten, weil mindestens eine Bestellung dort mehr als 5 Einheiten umfasst.

Eine mit transform übertragene Gruppengröße liefert für die erste Aufgabe eine schnellere, an den Zeilen ausgerichtete Maske:

sizes = sales.groupby("region")["units"].transform("size")
sales[sizes >= 3]

Diese Maske lässt sich mit & und | mit anderen Zeilenbedingungen kombinieren. Würdest du stattdessen sales.groupby("region")["revenue"].sum() filtern, blieben zusammenfassende Einträge erhalten, nicht die ursprünglichen Bestellungen.

Zeilen nach Position auswählen

head(n) wählt die ersten n Zeilen pro Gruppe, tail(n) die letzten n und nth(k) die Zeile an der ab null gezählten Position k. sales.groupby("region").head(1) gibt die Zeilen 0, 1 und 3 zurück: die erste beobachtete Bestellung jeder Region. Fehlende Werte führen nicht dazu, dass head(1) nach einer späteren Zeile ohne fehlenden Wert sucht.

Um die größte Bestellung pro Region auszuwählen, sortiere zuerst nach Umsatz:

sales.sort_values("revenue", ascending=False).groupby("region").head(1)

Die ausgewählten Zeilen sind Zeile 4 von South mit Umsatz 36, Zeile 0 von North mit 30 und Zeile 3 von East mit 20. Die Sortierung bestimmt, welche Beobachtung zuerst steht; die Gruppenoperation nimmt dann diese erste Zeile. Bei eindeutigen Zeilenbezeichnungen ruft sales.loc[sales.groupby("region")["revenue"].idxmax()] dieselben Maxima anhand ihrer Bezeichnungen ab.

Innerhalb jeder Gruppe Stichproben ziehen
sales.groupby("region").sample(n=1, random_state=0)

Dies zieht eine Bestellung aus jeder Region. Die Festlegung von random_state macht wiederholte Ausführungen mit denselben Daten reproduzierbar. Eine Stichprobe aus dem gesamten DataFrame könnte eine Region auslassen, selbst wenn diese insgesamt drei Zeilen hat.

Verwende frac=0.5, um etwa die Hälfte der Zeilen jeder Gruppe zu ziehen. Der Stichprobenumfang pro Gruppe wird gerundet: Mit frac=0.2 ergeben die zwei Zeilen von East 0,4 Zeilen, gerundet null. Verwende ausdrücklich n=1, wenn jede nicht leere Gruppe eine Beobachtung beitragen muss. Der angeforderte Stichprobenumfang muss mit den gewählten Stichprobeneinstellungen für die Gruppen möglich sein.

Wichtige Erkenntnisse

  • filter gibt ursprüngliche Zeilen aus Gruppen zurück, die ihre einzelne boolesche Bedingung erfüllen.
  • head, tail und nth wählen Zeilen in der aktuellen Reihenfolge aus.
  • Sortiere vor head, wenn du die größten Werte auswählst.
  • Eine gruppenweise Stichprobe mit n=1 berücksichtigt jede nicht leere Gruppe; ein kleiner Anteil kann kleine Gruppen auslassen.

3.4 Allgemeine Gruppenoperationen mit apply ausführen

apply ermöglicht es einer Funktion, eine ganze Gruppe zu untersuchen und einen Skalar, eine Series oder einen DataFrame zurückzugeben. Diese Flexibilität ist nützlich, wenn Spalten zusammenwirken müssen oder das Ergebnis mehrere Zeilen enthält. Sie macht aber auch die Form des Ergebnisses weniger vorhersehbar als bei agg oder transform.

Mehrere Spalten gemeinsam nutzen
def price_per_unit(g):
    return g["revenue"].sum() / g["units"].sum()

sales.groupby("region").apply(price_per_unit)

Die Funktion erhält die Zeilen einer Region. Sie gibt einen Wert zurück, sodass pandas die Ausgaben zu einer Series mit den Regionen als Index zusammenfasst: East 3,625, North etwa 3,304 und South etwa 3,810. Ein Verhältnis integrierter gruppierter Summen ergibt dasselbe Ergebnis mit weniger zusätzlichem Python-Aufwand. np.average(g["revenue"] / g["units"], weights=g["units"]) drückt das entsprechende gewichtete arithmetische Mittel aus.

Für einen Kennwert aus zwei Spalten, etwa die Korrelation zwischen Lernstunden und Punktzahl innerhalb jeder Lerngruppe, kann apply die beiden Series jeder Gruppe an .corr() übergeben.

Vorhersagen, wie Ausgaben zusammengefügt werden

Eine Funktion, die für jede Gruppe eine Series mit denselben Bezeichnungen zurückgibt, erzeugt eine Tabellenzeile pro Gruppe:

sales.groupby("region").apply(
    lambda g: pd.Series({
        "orders": len(g),
        "avg_price": g["revenue"].sum() / g["units"].sum()
    })
)

Die Spalten heißen orders und avg_price. Die Anzahlen erscheinen als 2.0, 3.0 und 3.0, weil die zurückgegebene Series auch einen Preis als Gleitkommazahl enthält. Haben die zurückgegebenen Series unterschiedliche Bezeichnungen, fügt pandas sie zu einer längeren Series zusammen und ergänzt Gruppenschlüssel als äußere Indexebene.

Ein DataFrame pro Gruppe wird zu einem größeren DataFrame zusammengefügt:

def top(g, n=2, col="revenue"):
    return g.sort_values(col, ascending=False).head(n)

sales.groupby("region").apply(top)

Die Zeilen sind East 3 und 5, North 0 und 2 sowie South 4 und 7. Jede Gruppe wird unabhängig sortiert. Zusätzliche Argumente folgen auf die Funktion: .apply(top, n=1, col="units") ändert die Auswahl zur Bestellung mit den meisten Einheiten.

Schlüssel und Ausrichtung steuern

Für diese zurückgegebenen Zeilen fügt die Standardeinstellung group_keys=True die Region als äußere Indexebene hinzu. sales.groupby("region", group_keys=False).apply(top) behält nur die ursprünglichen Zeilenbezeichnungen. Die Ergebnisse werden weiterhin gruppenweise zusammengefügt; die Zeilenreihenfolge der Eingabetabelle ist nicht garantiert.

Seit pandas 3.0 enthält der an ein gruppiertes apply übergebene DataFrame die Gruppierungsspalten nicht. In diesem Beispiel hat er product, units und revenue, aber nicht region. Lies den aktuellen Gruppenschlüssel aus g.name, wenn die Funktion ihn benötigt.

Die speziellere Methode verwenden, wenn sie passt

apply führt für jede Gruppe Python-Code aus und ermittelt, wie die Ausgabe zusammengefügt wird. Verwende agg für zusammenfassende Werte pro Spalte, transform für Ergebnisse, die an jeder Eingabezeile ausgerichtet sind, und filter für Entscheidungen, ob ganze Gruppen behalten oder entfernt werden.

Wenn du beispielsweise den Mittelwert jeder Region mit einem apply auf einer ausgewählten Series subtrahierst, erhältst du Differenzen unter einem MultiIndex aus Region und Zeile. transform gibt die Differenzen mit dem ursprünglichen Index zurück, sodass sie als Spalte zugewiesen werden können.

Wichtige Erkenntnisse

  • apply kann mehrere Spalten nutzen und flexible Ergebnisformen zurückgeben.
  • Ein skalares Ergebnis ergibt eine Series; übereinstimmende Series-Bezeichnungen ergeben eine Tabelle.
  • DataFrame-Ergebnisse werden aneinandergefügt, gewöhnlich mit Gruppenschlüsseln im Index.
  • Seit pandas 3.0 schließt ein gruppiertes apply die Gruppierungsspalten aus jeder Eingabegruppe aus.
  • Bevorzuge agg, transform oder filter, wenn ihre Ergebnisform passt.
  • Verwende group_keys, um äußere Gruppenbezeichnungen zu steuern, nicht um die ursprüngliche Zeilenreihenfolge wiederherzustellen.
4

Numerische Daten in Klassen einteilen und Gruppen nach Klassen und Quantilen analysieren

Numerische Werte können zu nützlichen Gruppenbezeichnungen werden, wenn du sie in Intervalle einteilst. Feste Grenzen ermöglichen es, dieselben Bereiche über Berichte hinweg zu vergleichen; Quantile ermöglichen Vergleiche zwischen unteren und oberen Teilen einer Stichprobe. Du erstellst beide Arten von Klassen, untersuchst Grenzen und gleiche Werte und fasst innerhalb der Klassen eine andere Variable zusammen. Anzahlen neben den Zusammenfassungen zeigen, auf wie vielen Daten jeder Vergleich beruht.

4.1 Werte mit cut in Intervalle einteilen

Die Klasseneinteilung, auch Diskretisierung genannt, ersetzt numerische Werte durch Intervallkategorien. Verwende sie, wenn ein Bericht aussagekräftige Bereiche wie Punktzahlbereiche statt einer eigenen Gruppe für jede Zahl benötigt.

Grenzen ausdrücklich festlegen
scores = pd.Series([42, 50, 55, 64, 68, 70, 73, 81, 85, 88, 97, 100])
bands = pd.cut(scores, [0, 50, 70, 85, 100])
bands.value_counts(sort=False)

Fünf Grenzen definieren vier Klassen: (0, 50], (50, 70], (70, 85] und (85, 100]. Sie enthalten 2, 4, 3 und 3 Punktzahlen. Ausdrücklich angegebene Grenzen können zu unterschiedlichen Breiten führen, weil sie inhaltlich bedeutsame Grenzen beschreiben.

In der pandas-Ausgabe schließt eine runde Klammer einen Endpunkt aus und eine eckige Klammer ihn ein. Bei der Standardeinstellung right=True gehört 50 in die erste Klasse, 70 in die zweite, 85 in die dritte und 100 in die vierte. Lies (50, 70] als „größer als 50 und höchstens 70“.

Die äußeren Grenzen berücksichtigen

Bei diesen ausdrücklich angegebenen Grenzen ist 0 aus dem ersten Intervall ausgeschlossen und 101 liegt jenseits des letzten Intervalls. Beide erhalten NaN. Verwende include_lowest=True, um einen Wert einzuschließen, der der untersten Grenze entspricht. Werte unter der untersten oder über der obersten Grenze erhalten weiterhin keine Klasse.

Verwende für links abgeschlossene Intervalle right=False. Dieselben Grenzen definieren dann [0, 50), [50, 70), [70, 85) und [85, 100). Nun wechselt 50 in die zweite Klasse und 100 ist ausgeschlossen. Die Anzahlen im Beispiel werden zu 1, 4, 3 und 3; eine Klassenzuordnung fehlt. Eine obere Grenze von 101 würde die Punktzahl 100 in die letzte links abgeschlossene Klasse einschließen.

Änderst du den Intervallabschluss, änderst du die Zuordnung an einer Grenze. Prüfe ein Minimum, eine innere Grenze und ein Maximum, bevor du die Bereiche in einem Bericht verwendest.

Verständliche Bezeichnungen hinzufügen
bands = pd.cut(
    scores, [0, 50, 70, 85, 100],
    labels=["fail", "pass", "merit", "distinction"]
)

Gib für jedes Intervall eine Bezeichnung an: vier Bezeichnungen für fünf Grenzen. Die Ausgabe sind geordnete kategoriale Daten, sodass die Reihenfolge fail, pass, merit, distinction lautet, nicht die alphabetische Reihenfolge. labels=False gibt für zugeordnete Werte stattdessen die ab null gezählten Klassencodes 0 bis 3 zurück.

value_counts() sortiert normalerweise nach Häufigkeit. Verwende sort=False oder sortiere den Index des Ergebnisses, um die Intervallreihenfolge beizubehalten. Andernfalls kann der häufigste Bereich zuerst erscheinen und die Verteilung schwerer lesbar machen.

pandas um gleiche Breiten bitten

Die Übergabe einer Ganzzahl fordert entsprechend viele Klassen gleicher Breite an:

bands, edges = pd.cut(scores, 4, retbins=True)

Der Bereich von 42 bis 100 umfasst 58 und ergibt Breiten von 14,5. Die inneren Grenzen sind 56,5, 71,0 und 85,5. pandas erweitert das untere Ende für diese rechts abgeschlossenen Klassen geringfügig. So entsteht eine erste Grenze von 41,942, damit das Minimum enthalten ist. Jede Klasse enthält hier zufällig drei Punktzahlen; gleiche Breiten ergeben nicht grundsätzlich gleiche Anzahlen.

retbins=True gibt neben den Zuordnungen auch die tatsächlichen Grenzen zurück. Ausdrücklich angegebene Grenzen müssen aufsteigend sein: [0, 70, 50, 100] kann die gewünschte Intervallfolge nicht definieren.

Wichtige Erkenntnisse

  • cut wandelt numerische Werte in Intervallkategorien um.
  • Standardmäßig schließen Klassen die linke Grenze aus und die rechte ein.
  • Bei ausdrücklich angegebenen Grenzen bleiben Werte außerhalb des Bereichs ohne Zuordnung.
  • include_lowest=True schließt die unterste ausdrücklich angegebene Grenze ein.
  • Eine ganzzahlige Klassenanzahl fordert gleiche Breiten an, nicht gleiche Besetzungszahlen.
  • Bezeichnungen und Anzahlen müssen die gewünschte Intervallreihenfolge beibehalten.
  • right=False ändert, welcher Endpunkt zu jedem Intervall gehört; prüfe nach der Änderung des Intervallabschlusses das Maximum.

4.2 Mit Quantilen und qcut Klassen gleicher Besetzungszahl bilden

Ein Quantil beschreibt eine Position in sortierten Daten. Der Median ist das 0,5-Quantil; Quartile teilen die Verteilung in Viertel, Dezile in Zehntel und Perzentile in Hundertstel. qcut verwendet Stichprobenquantile als Klassengrenzen.

Ein Quantil berechnen

Für die Punktzahlen 42, 50, 55, 64, 68, 70, 73, 81, 85, 88, 97 und 100:

scores.quantile([0.25, 0.5, 0.75])

Die Ergebnisse sind 61,75, 71,5 und 85,75. pandas verwendet standardmäßig lineare Interpolation. Für das 0,25-Quantil ist die ab null gezählte Position:

0,25(12−1)=2,75

An Position 2 steht 55 und an Position 3 steht 64. Gehe drei Viertel des Abstands zwischen ihnen:

55+0,75(64−55)=61,75

Ein Stichprobenquantil kann daher zwischen beobachteten Werten liegen. Es muss keiner Punktzahl entsprechen, die tatsächlich jemand erreicht hat.

Quantilgruppen erstellen
quartile = pd.qcut(scores, 4, labels=["Q1", "Q2", "Q3", "Q4"])

Diese Stichprobe ergibt drei Punktzahlen pro Quartilgruppe. Die inneren Grenzen sind die drei berechneten Quartile. Das erste Intervall schließt das Minimum ein; die Intervallanzeige setzt seine untere Bezeichnung geringfügig unter 42. Verwende labels=False für die Codes 0 bis 3 oder retbins=True, um die numerischen Grenzen abzurufen.

Eine Liste von Anteilen steuert die Quantilbereiche. pd.qcut(x, [0, 0.1, 0.5, 0.9, 1]) trennt die unteren 10 %, zwei am Median geteilte Bereiche dazwischen und die oberen 10 %.

Zwischen Breiten und Besetzungszahlen wählen
MethodeWas legt die Grenzen fest?Was bleibt vergleichbar?
cut(x, n)Gleiche Intervalle über den beobachteten BereichNumerische Breite
cut(x, edges)Ausdrücklich angegebene GrenzenDie gewählten Bereiche
qcut(x, n)Quantile dieser StichprobeUngefähre Anzahl der Beobachtungen

Lieferzeiten von 5, 6, 7, 7, 8, 9, 10, 12, 15, 20, 35 und 60 Minuten zeigen den Unterschied. Drei Klassen gleicher Breite enthalten 10, 1 und 1 Beobachtungen. Drei Quantilklassen enthalten jeweils 4, mit inneren Grenzen bei etwa 7,67 und 13 Minuten. Lange Verzögerungen dehnen den Bereich der Klassen gleicher Breite aus, sodass die meisten Beobachtungen in der ersten Klasse liegen.

Verwende feste Grenzen, wenn dieselben Zeitbereiche über Datensätze hinweg verglichen werden müssen. Quantilgrenzen ändern sich, wenn sich die Stichprobe ändert.

Gleiche Werte sichtbar halten

Für die Werte 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 10 und 12 sind die Quartilgrenzen 3,75, 6 und 8,25. Beide Werte 6 gehören zusammen, sodass die Klassen 3, 4, 2 und 3 Werte enthalten. Bei gleichen Werten ist die Einteilung in Klassen gleicher Besetzungszahl nur näherungsweise möglich.

Bei vielen gleichen Werten können Quantilgrenzen zusammenfallen. Für 1, 1, 1, 1, 1, 1, 2 und 3 ergeben sich beim Anfordern von Quartilen wiederholte Grenzen. duplicates="drop" entfernt doppelte Grenzen und lässt nur zwei Klassen mit den Anzahlen 6 und 2 übrig. Eine vorherige Rangvergabe mit rank(method="first") kann vier gleich große Gruppen erzwingen, teilt aber gleiche Werte nach Zeilenreihenfolge auf. Dadurch ändert sich die Bedeutung: Statt Werteintervallen entstehen Gruppen auf Basis von Rängen, bei denen Bindungen aufgelöst wurden.

Wichtige Erkenntnisse

  • Quantile können zwischen Beobachtungen liegen, weil pandas interpoliert.
  • qcut verwendet Stichprobenquantile, um Gruppen mit annähernd gleicher Besetzungszahl zu erstellen.
  • Verwende feste cut-Grenzen für Bereiche, die über Datensätze hinweg vergleichbar bleiben müssen.
  • Gleiche Werte können zu ungleichen Besetzungszahlen von Quantilklassen oder zu doppelten Grenzen führen.
  • Das Entfernen doppelter Grenzen verringert die Klassenanzahl; eine vorherige Rangvergabe teilt gleiche Werte auf.

4.3 Durch Klassen und Quantile definierte Gruppen vergleichen

Eine Klassenbezeichnung kann als Gruppenschlüssel dienen. Damit kannst du untersuchen, wie sich eine Variable über Bereiche einer anderen verändert, etwa die durchschnittliche Prüfungspunktzahl über Lernstundenbereiche hinweg. Die Zusammenfassung beschreibt die Beobachtungen in jedem Bereich.

Eine klassenbasierte Zusammenfassung erstellen

Erstelle die Daten der Lernenden:

students = pd.DataFrame({
    "group": ["day", "evening", "day", "evening", "day", "evening", "day", "evening", "day", "day", "evening", "day"],
    "hours": [2, 3, 3, 5, 4, 6, 6, 8, 7, 9, 10, 12],
    "score": [42, 50, 55, 64, 68, 70, 73, 81, 85, 88, 97, 100]
})
hour_band = pd.cut(students["hours"], [0, 3, 6, 9, 12])
students.groupby(hour_band)["score"].agg(["count", "mean"])

Die vier Bereiche enthalten 3, 4, 3 und 2 Lernende. Ihre mittleren Punktzahlen sind 49, 68,75, etwa 84,67 und 98,5. Im ersten Bereich sind die Punktzahlen 42, 50 und 55; ihr arithmetisches Mittel ist 147/3 = 49. Die Anzahl zeigt, auf wie vielen erfassten Punktzahlen jeder Mittelwert beruht.

Die Series mit den Bereichen hat einen Eintrag pro lernender Person und denselben Index, sodass ihre Zuordnungen beim Gruppieren zu den Zeilen passen. Die numerische Spalte hours bleibt für andere Berechnungen verfügbar.

Leere Klassen behalten, wenn ein Bericht sie benötigt

Seit pandas 3.0 ist observed=True beim Gruppieren nach kategorialen Schlüsseln die Standardeinstellung. Fügst du eine Grenze bei 15 hinzu, wird der unbenutzte Bereich (12, 15] ausgelassen. observed=False behält ihn mit Anzahl 0 und arithmetischem Mittel NaN. Null Lernende ist eine Anzahl; ein Mittelwert von null würde fälschlich nahelegen, dass beobachtete Punktzahlen im Durchschnitt null betragen.

Klassen sind geordnete Kategorien, sodass die normale gruppierte Ausgabe der Intervallreihenfolge von niedrig nach hoch folgt. Benannte Bezeichnungen behalten die Reihenfolge ihrer Intervalle.

Quantilgruppen und Kombinationen analysieren
quartile = pd.qcut(students["hours"], 4,
                   labels=["Q1", "Q2", "Q3", "Q4"])
students.groupby(quartile)["score"].agg(["count", "min", "max", "mean"])

Die Anzahlen sind 3, 4, 2 und 3, die mittleren Punktzahlen 49, 68,75, 83 und 95. Die beiden gleichen Werte 6 erklären die ungleichen Anzahlen. Um die Lernenden der Tages- und Abendgruppe innerhalb jedes Quartils zu vergleichen, gruppiere nach [quartile, "group"] und rufe .mean().unstack() auf. Die Mittelwerte für Q1 sind day 48,5 und evening 50; die für Q4 sind day 94 und evening 97.

Die Richtung der Analyse ist wichtig. Die Gruppierung der Lernstunden nach Punktzahlbereichen beantwortet eine andere Frage: Die durchschnittlichen Stunden für die Bereiche fail, pass, merit und distinction sind 2,5, 4,5, 7 und etwa 10,33.

Entscheiden, welche Population ein Quantil definiert

Eine Aufteilung der Punktzahlen am Gesamtmedian verwendet 71,5. Eine Aufteilung innerhalb jeder Lerngruppe verwendet deren eigenen Median: day 73 und evening 70.

within_class = students.groupby("group")["score"].transform(
    lambda s: pd.qcut(s, 2, labels=["lower", "upper"])
)

Der Lernende der Tagesgruppe mit 73 Punkten liegt über dem Gesamtmedian, gehört aber innerhalb der Tagesgruppe zur unteren Hälfte. Beide Bezeichnungen sind richtig, weil sie unterschiedliche Vergleichsfragen beantworten.

Ein steigender Mittelwert über die Stundenbereiche hinweg ist ein Zusammenhang. Lernende in verschiedenen Bereichen können sich auch in anderer Hinsicht unterscheiden. Daher kann die Tabelle allein nicht belegen, dass zusätzliche Lernzeit den Punktzahlunterschied verursacht hat. Kleine Anzahlen machen einen Mittelwert außerdem anfälliger für den Einfluss einer einzelnen Beobachtung.

Wichtige Erkenntnisse

  • Verwende eine Series mit Klassen als Gruppenschlüssel, um eine andere Variable zusammenzufassen.
  • Gib Anzahlen neben Mittelwerten an, damit sichtbar ist, auf wie vielen Daten die Mittelwerte beruhen.
  • observed=False behält leere Klassen mit Anzahlen von null und fehlenden Mittelwerten.
  • Gesamtquantile und Quantile innerhalb von Gruppen verwenden unterschiedliche Referenzpopulationen.
  • Muster über Klassen hinweg beschreiben einen Zusammenhang und können bei kleinen Stichproben empfindlich reagieren.
5

Daten in Pivot-Tabellen und Kreuztabellen zusammenfassen

Eine zweidimensionale Tabelle macht Kombinationen von Kategorien leicht vergleichbar. Eine Pivot-Tabelle fasst einen numerischen Wert an jedem Schnittpunkt von Zeile und Spalte zusammen, während eine Kreuztabelle gewöhnlich Beobachtungen zählt. Summen und Anteile liefern zusätzlichen Kontext, ihre Bedeutung hängt aber von der Aggregation und dem Nenner ab. Du erstellst beide Tabellen und liest jede Zelle als Antwort auf eine genaue Frage.

5.1 Pivot-Tabellen mit pivot_table erstellen

Eine Pivot-Tabelle fasst Werte für Kombinationen von Zeilen- und Spaltenschlüsseln zusammen. Jede Zelle sammelt die Beobachtungen an einem Schnittpunkt und wendet eine Funktion an, etwa eine Summe oder ein arithmetisches Mittel.

Die Rollen ausdrücklich zuweisen
sales.pivot_table(
    index="region", columns="product",
    values="revenue", aggfunc="sum"
)

index liefert die Zeilenschlüssel, columns die Spaltenschlüssel, values die gemessene Variable und aggfunc die Berechnung. Die Tabelle lautet:

Regioncoffeetea
East209
North2848
South6812

North–tea fasst die Umsätze 30 und 18 zusammen, die Summe ist also 48. South–coffee fasst 36 und 32 zusammen und ergibt 68. Dieselben Daten lassen sich mit sales.groupby(["region", "product"])["revenue"].sum().unstack() zusammenfassen.

Der Standardwert für aggfunc ist "mean". Ohne diese Angabe ergäbe sich für North–tea 24 und für South–coffee 34. Gib aggfunc="sum" an, wenn nach Summen gefragt wird; am Aufbau einer Tabelle allein lässt sich nicht erkennen, welchen Kennwert sie enthält.

Fehlende Kombinationen sorgfältig auffüllen

Kombinationen ohne Beobachtungen erscheinen als NaN. Entfernst du die Teebestellung von East, fehlt der Wert in dieser Zelle. fill_value=0 kann in einem Summen- oder Anzahlbericht darstellen, dass keine Bestellungen vorliegen. Bei einem arithmetischen Mittel legt das Ersetzen einer leeren Zelle durch 0 einen beobachteten Mittelwert nahe, der nie gemessen wurde. Lass den Wert fehlend, wenn kein Mittelwert existiert.

Für kategoriale Schlüssel gilt die Einstellung observed; seit pandas 3.0 zeigt die Standardeinstellung beobachtete Kategorien. Lege sie ausdrücklich fest, wenn ein Bericht unbenutzte Kategorien behalten muss.

Randaggregate mit derselben Funktion hinzufügen
sales.pivot_table(
    index="region", columns="product", values="revenue",
    aggfunc="sum", margins=True, margins_name="Total"
)

Die Zeilensummen sind East 29, North 76 und South 80. Die Spaltensummen sind coffee 116 und tea 69; die Gesamtsumme ist 185. margins_name ersetzt die Standardbezeichnung All.

Randaggregate werden mit der Aggregationsfunktion aus den zugrunde liegenden Zeilen neu berechnet. Bei einer Pivot-Tabelle mit arithmetischen Mitteln steht in der Ecke 23,125, der Mittelwert aller acht Bestellungen. Das arithmetische Mittel der sechs angezeigten Zellmittelwerte wäre etwa 21,17, weil die Zellen unterschiedliche Anzahlen von Beobachtungen enthalten. Ein Randaggregat ist keine allgemeine Anweisung, die jeweils angezeigten Zahlen zu addieren oder zu mitteln.

Die Tabelle erweitern oder Anzahlen berechnen

aggfunc=["sum", "mean"] erstellt für jeden Kennwert einen Spaltenblock. Bei units hat North–tea die Summe 16 und das arithmetische Mittel 8. Ein Funktionsdictionary wie {"units": "sum", "revenue": "max"} weist getrennten Wertespalten Funktionen zu. Mehrere Schlüssel können auch hierarchische Zeilen oder Spalten erzeugen, und in Klassen eingeteilte Werte funktionieren als kategoriale Schlüssel.

aggfunc="size" zählt Zeilen pro Zelle, während "count" nicht fehlende Werte in der gewählten Wertespalte zählt. North hat eine Kaffeebestellung und zwei Teebestellungen.

pivot aggregiert nicht und benötigt eindeutige Zeilen-Spalten-Kombinationen. Die Verkaufstabelle enthält wiederholte Kombinationen North–tea und South–coffee, sodass pivot einen Fehler wegen doppelter Einträge auslöst. Verwende pivot_table, wenn mehrere Beobachtungen in einer Zelle zusammengefasst werden müssen.

Wichtige Erkenntnisse

  • index, columns, values und aggfunc bestimmen die Bedeutung jeder Zelle der Pivot-Tabelle.
  • Die Standardaggregation ist ein arithmetisches Mittel; fordere Summen ausdrücklich an.
  • Fülle fehlende Anzahlen oder Summen nur dann mit null auf, wenn null das Fehlen korrekt ausdrückt.
  • Randaggregate wenden dieselbe Funktion auf die zugrunde liegenden Beobachtungen an.
  • Mehrere Funktionen oder Werte können hierarchische Spalten erzeugen.
  • Verwende pivot_table für wiederholte Schlüsselkombinationen und pivot für eindeutige Kombinationen.

5.2 Mit crosstab Kategorien auszählen und vergleichen

Eine Kreuztabelle, auch Kontingenztabelle genannt, zählt Beobachtungen für Kombinationen kategorialer Variablen. Anteile ermöglichen anschließend den Vergleich von Gruppen mit unterschiedlich vielen Beobachtungen.

Kombinationen zählen

Die Umfragedaten enthalten sechs Nutzer des Basistarifs: Vier verwenden Smartphones und zwei Laptops. Zu den vier Premium-Nutzern gehören ein Smartphone-Nutzer und drei Laptop-Nutzer.

survey = pd.DataFrame({
    "plan": ["basic"] * 6 + ["premium"] * 4,
    "device": ["phone", "phone", "phone", "laptop", "phone", "laptop",
               "laptop", "laptop", "phone", "laptop"],
    "minutes": [20, 35, 15, 40, 25, 50, 60, 45, 30, 55]
})
counts = pd.crosstab(survey["plan"], survey["device"], margins=True)

Übergib die tatsächlichen Series, nicht die Zeichenketten "plan" und "device". Die erste Variable liefert Zeilen und die zweite Spalten. Die Zeile basic enthält laptop 2 und phone 4; die Zeile premium enthält laptop 3 und phone 1. Die Zeilensummen sind 6 und 4, die Spaltensummen 5 und 5 und die Gesamtsumme ist 10.

Bei absoluten Häufigkeiten wird eine nicht vorhandene Kombination als null angezeigt. Dieselben Anzahlen erhältst du mit survey.groupby(["plan", "device"]).size().unstack(fill_value=0) oder einer Pivot-Tabelle mit aggfunc="size". survey.value_counts(["plan", "device"]) ergibt eine lange, nach Anzahl sortierte Häufigkeitsliste.

Den Nenner aus der Frage wählen
EinstellungNennerBedeutung von basic–phone
normalize="all"Alle Beobachtungen4/10 = 0,4
normalize="index"Zeilensumme basic4/6 ≈ 0,667
normalize="columns"Spaltensumme phone4/5 = 0,8

„Welcher Anteil der Premium-Nutzer verwendet einen Laptop?“ geht von den Premium-Nutzern aus, also ist der Nenner 4. Verwende Zeilennormierung; die Antwort ist 3/4 = 0,75. „Welcher Anteil der Smartphone-Nutzer hat den Basistarif?“ geht von den Smartphone-Nutzern aus, also ist der Nenner 5. Verwende Spaltennormierung; die Antwort ist 4/5 = 0,8.

Die Anzahl von drei Premium-Nutzern mit Laptop übersteigt die Anzahl von zwei im Basistarif, doch der Vergleich innerhalb der Tarife ergibt 75 % gegenüber etwa 33,3 %. Bestimme die verglichene Population, bevor du eine Anzahl in einen Anteil umwandelst. Multipliziere normierte Werte für Prozentangaben mit 100.

Mit margins=True haben auch normierte Randaggregate eine Bedeutung. Die Zeilennormierung fügt eine All-Zeile mit den Geräteanteilen insgesamt hinzu, 0,5 und 0,5. Die Spaltennormierung fügt eine All-Spalte mit den Tarifanteilen insgesamt hinzu, 0,6 und 0,4.

Eine dritte Variable zusammenfassen

Gib values und aggfunc an, um Häufigkeiten durch einen numerischen Kennwert zu ersetzen:

pd.crosstab(survey["plan"], survey["device"],
            values=survey["minutes"], aggfunc="mean")

Laptop-Sitzungen im Basistarif von 40 und 50 Minuten dauern durchschnittlich 45 Minuten. Smartphone-Sitzungen im Basistarif von 20, 35, 15 und 25 Minuten dauern durchschnittlich 23,75 Minuten. Laptop-Sitzungen im Premiumtarif von 60, 45 und 55 Minuten dauern durchschnittlich etwa 53,33 Minuten, während die einzelne Smartphone-Sitzung im Premiumtarif 30 Minuten dauert. Diese Zellen beschreiben die Sitzungsdauer, nicht Nutzerzahlen.

Eine Liste von Series kann mehrere Zeilen- oder Spaltenebenen liefern. Auch in Klassen eingeteilte Punktzahlen funktionieren als Kategorien: Die Kreuzung von fail, pass, merit und distinction mit der Lerngruppe ergibt für day die Anzahlen 1, 2, 2, 2 und für evening die Anzahlen 1, 2, 1, 1. Die Bedeutung jeder Zelle ergibt sich weiterhin aus ihrem Zeilenschlüssel, ihrem Spaltenschlüssel und dem gewählten Kennwert.

Wichtige Erkenntnisse

  • crosstab zählt Kombinationen der übergebenen Series oder Arrays.
  • Wähle Zeilen-, Spalten- oder Gesamtnormierung anhand der Population, auf die sich der Nenner der Frage bezieht.
  • Durch Hinzufügen von values und aggfunc enthalten die Zellen statt Häufigkeiten eine numerische Zusammenfassung.

Gruppierung und Aggregation mit pandas: Beispiele

5 Interaktive Lektionen

1

Zeilen in nützliche Gruppen aufteilen

12 Schritte
Erstelle und untersuche eine Gruppierung, wähle Schlüssel und berücksichtige jede Zeile im Ergebnis.
  1. 1
    EinführungMit einer Frage zu Gruppen beginnen

    Eine Sammlung von Bestellungen kann „Wie viele Einheiten wurden verkauft?“ oder „Wie viele Einheiten hat jede Region verkauft?“ beantworten. Die zweite Frage benötigt einen Gruppierungsschlüssel.

    Wir teilen Bestellungen nach Region auf, wählen eine Wertespalte aus und fassen die Gruppenergebnisse zusammen. Dann ändern wir die Schlüssel und den Aufbau der Ausgabe und behalten dabei im Blick, welche Zeilen die Berechnung einbezieht.

  2. 2
    BeispielVier Bestellungen anlegen

    Verwende eine kleine Tabelle, damit du jede Zeile verfolgen kannst:

    orders = pd.DataFrame({
        "region": ["West", "East", "West", "East"],
        "product": ["tea", "tea", "coffee", "tea"],
        "units": [6, 3, 8, 5]
    })
    

    Die beiden Zeilen von West sind durch eine Zeile von East getrennt. Sie gehören dennoch zusammen, wenn die Region der Schlüssel ist; übereinstimmende Schlüssel sind wichtiger als benachbarte Positionen.

  3. 3
    ErklärungAufteilen, addieren, zusammenfassen
    orders.groupby("region")["units"].sum()
    

    East erhält die Einheiten 3 und 5, was 8 ergibt. West erhält 6 und 8, was 14 ergibt. pandas fasst die beiden Summen in einer Series mit den Regionen als Index zusammen.

    Der alleinige Aufruf von groupby("region") erstellt das GroupBy-Objekt. Die Auswahl und sum() legen fest, was aus dieser Gruppierung berechnet wird.

  4. 4
    TippVor dem Berechnen untersuchen

    Speichere g = orders.groupby("region"), wenn mehrere Untersuchungen nützlich sind. g.ngroups meldet 2, g.size() meldet zwei Zeilen pro Region und g.get_group("West") zeigt die Beobachtungen von West.

    Die Auswahl g["units"] ergibt ein SeriesGroupBy. Die Auswahl g[["units"]] behält die DataFrame-Form bei, obwohl nur eine Wertespalte ausgewählt ist.

  5. 5
    HerausforderungEine veränderte Summe vorhersagen

    Eine neue Bestellung aus West mit 4 Einheiten wird an die Tabelle angefügt. Wie lauten die regionalen Summen und entfernt die Gruppierung die ursprünglichen Bestellzeilen?

    ---reveal---

    East bleibt bei 8. West steigt auf 18, weil die neue Bestellung zu den vorhandenen 14 Einheiten hinzukommt. Die ursprünglichen Zeilen bleiben in der Eingabetabelle; die gruppierte Summe ist ein neues Zusammenfassungsobjekt mit einem Eintrag pro Region.

  6. 6
    BeispielEinen zweiten Schlüssel hinzufügen
    orders.groupby(["region", "product"])["units"].sum()
    

    Für die ursprünglichen vier Bestellungen ergibt East–tea zusammen 8, West–coffee zusammen 8 und West–tea zusammen 6. Die Series hat einen zweistufigen Index.

    unstack() verschiebt das Produkt in die Spalten. East hat keine coffee-Zeile, sodass der Wert in der coffee-Zelle fehlt; ihn mit null aufzufüllen, passt zu diesem Bericht über Einheitensummen.

  7. 7
    VerbindungEin Schlüssel kann berechnet werden
    orders.groupby(orders["units"] >= 5)["units"].sum()
    

    Der boolesche Schlüssel erzeugt eine Gruppe False mit der Summe 3 und eine Gruppe True mit der Summe 19. Er bezeichnet jede Zeile, statt kleine Bestellungen herauszufiltern.

    Auch eine zugeordnete Series funktioniert als Schlüssel. Series als Schlüssel werden anhand der Zeilenbezeichnung ausgerichtet, während ein Array eine Bezeichnung pro Position liefert und zur Zeilenanzahl passen muss.

  8. 8
    HerausforderungEinen Schlüssel aus dem Index lesen

    Eine Series mit Lagerbeständen hat den Index M1, N1, M2 und die Werte 4, 9, 7. Was gibt stock.groupby(lambda label: label[0]).sum() zurück?

    ---reveal---

    M ergibt zusammen 11 und N zusammen 9. Die Funktion erhält jede Indexbezeichnung und gibt ihren ersten Buchstaben zurück. Sie untersucht nicht den Lagerbestand. Auch ein direkt als Schlüssel übergebenes Dictionary ordnet Indexbezeichnungen zu; ordne zuerst eine Spalte zu, wenn deren Werte die Gruppen definieren.

  9. 9
    ErklärungBezeichnungen und Reihenfolge wählen

    orders.groupby("region", as_index=False)["units"].sum() gibt eine Tabelle mit den Spalten region und units zurück. reset_index() wandelt eine indizierte Zusammenfassung in denselben flachen Aufbau um.

    Die standardmäßige Schlüsselsortierung führt East vor West auf. Um Summen in eine Rangfolge zu bringen, sortiere stattdessen die berechneten Werte: .sum().sort_values(ascending=False). Schlüsselreihenfolge und Wertereihenfolge erfüllen unterschiedliche Anforderungen.

  10. 10
    KernaussageFehlende und unbenutzte Schlüssel unterscheiden sich

    Angenommen, die Region ist kategorial und deklariert auch North, ohne dass es Bestellungen aus North gibt. Seit pandas 3.0 lässt die Standardeinstellung observed=True diese unbenutzte Kategorie aus; observed=False zeigt sie an.

    Eine Zeile ohne Region ist ein eigener Fall. Die Standardeinstellung dropna=True schließt sie aus den Gruppen aus. dropna=False behält eine Gruppe für fehlende Schlüssel. Die eine Option kann die andere nicht ersetzen.

  11. 11
    HerausforderungDen Bericht abstimmen

    Die ursprünglichen vier Bestellungen ergeben zusammen 22 Einheiten. Eine fünfte Bestellung hat 7 Einheiten und keine Region. Eine kategoriale Regionsspalte deklariert außerdem ein unbenutztes North. Wie kann ein Bericht insgesamt 29 ergeben und North anzeigen?

    ---reveal---

    Gruppiere mit dropna=False, observed=False. Die Gruppe für fehlende Schlüssel behält die zusätzlichen 7; North erscheint als unbenutzte Kategorie mit der Summe 0. Verwende zusätzlich as_index=False, wenn der Bericht normale Schlüsselspalten benötigt.

  12. 12
    ZusammenfassungSchlüssel, Werte und Form prüfen

    Wähle den Schlüssel, der ausdrückt, welche Zeilen zusammengehören, und wähle dann die Operation und die benötigten Wertespalten. Untersuche Gruppen, wenn ihre Zugehörigkeit unklar ist.

    Prüfe nach der Berechnung einer Summe, ob Zeilen wegen fehlender Schlüssel ausgeschlossen wurden. Entscheide für die Darstellung zwischen einem indizierten Ergebnis und normalen Schlüsselspalten und unterscheide das Sortieren von Gruppennamen von der Rangfolge der berechneten Werte.

2

Gruppenzusammenfassungen auswählen und benennen

13 Schritte
Berechne einen Bericht mit mehreren Spalten und unterscheide Zeilenanzahlen, erfasste Werte und gewichtete Mittelwerte.

Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.

  1. 1
    EinführungEine Zusammenfassung muss eine Frage beantworten
  2. 2
    BeispielEine Charge mit einem fehlenden Wert betrachten
  3. 3
    ErklärungDie Standardeinstellungen der Reduktionen verstehen
  4. 4
    HerausforderungDie verfügbaren Messwerte zählen
  5. 5
    BeispielJede Ausgabe benennen
  6. 6
    ErklärungSpalten mit mehreren Funktionen verstehen
  7. 7
    HerausforderungDie Berichtsnamen korrigieren
  8. 8
    BeispielEine eigene Spannweite ergänzen
  9. 9
    TippEine boolesche Spalte vorbereiten
  10. 10
    BeispielDie gemessene Menge gewichten
  11. 11
    HerausforderungDen Preis pro Einheit ermitteln
  12. 12
    HerausforderungMittelwerte ungleich großer Gruppen kombinieren
  13. 13
    ZusammenfassungDie Bedeutung jedes Kennwerts erhalten
3

Gruppenkontext den richtigen Zeilen zuordnen

16 Schritte
Berechne Anteile und reihenfolgeabhängige Werte, filtere Gruppen und erstelle flexible Ausgaben, ohne die Zeilenausrichtung zu verlieren.

Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.

  1. 1
    EinführungEntscheiden, welche Zeilen die Antwort benötigt
  2. 2
    BeispielEine Summe übertragen
  3. 3
    BeispielSummen in Anteile umwandeln
  4. 4
    HerausforderungDen richtigen Füllwert wählen
  5. 5
    ErklärungZuerst die Reihenfolge festlegen
  6. 6
    BeispielMit der vorherigen Beobachtung vergleichen
  7. 7
    TippDie Regel für Rangbindungen wählen
  8. 8
    HerausforderungVerschachtelt auftretende Gruppen verfolgen
  9. 9
    BeispielAlle Zeilen einer passenden Gruppe behalten
  10. 10
    TippInnerhalb von Gruppen auswählen oder Stichproben ziehen
  11. 11
    HerausforderungEine Bedingung für die ganze Gruppe anwenden
  12. 12
    ErklärungDie Ergebnisform von apply vorhersagen
  13. 13
    BeispielMehrere Zeilen pro Gruppe zurückgeben
  14. 14
    HerausforderungEine Zeilenzuweisung korrigieren
  15. 15
    HerausforderungEine Gruppensumme mit einer Zeilenentscheidung verbinden
  16. 16
    ZusammenfassungDie Methode auf das Ergebnis abstimmen
4

Numerische Bereiche erstellen und vergleichen

14 Schritte
Wähle feste Grenzen oder Quantilgrenzen und nutze die entstehenden Kategorien für gruppierte Analysen.

Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.

  1. 1
    EinführungDie Bedeutung eines Bereichs festlegen
  2. 2
    BeispielFeste Intervalle erstellen
  3. 3
    ErklärungDie äußeren Werte abdecken
  4. 4
    TippBezeichnungen in Intervallreihenfolge halten
  5. 5
    HerausforderungWerte an Grenzen zuordnen
  6. 6
    ErklärungEin Stichprobenquantil bestimmen
  7. 7
    BeispielNach Besetzungszahl oder Breite aufteilen
  8. 8
    KernaussageGleiche Werte können die Klassenanzahl verändern
  9. 9
    HerausforderungStabile Grenzen wählen
  10. 10
    BeispielEine andere Variable zusammenfassen
  11. 11
    TippLeere Gruppen wahrheitsgetreu anzeigen
  12. 12
    HerausforderungDie Referenzpopulation ändern
  13. 13
    HerausforderungDen abschließenden Vergleich interpretieren
  14. 14
    ZusammenfassungVor dem Ergebnisvergleich die Bereiche lesen
5

Zweidimensionale Summen und Anteile interpretieren

11 Schritte
Erstelle eine Pivot-Tabelle und wähle die Nenner einer Kreuztabelle anhand der gestellten Frage.

Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.

  1. 1
    EinführungJeder Zelle eine Bedeutung geben
  2. 2
    BeispielEine kleine Pivot-Tabelle erstellen
  3. 3
    ErklärungDie Aggregation angeben
  4. 4
    KernaussageRandaggregate beruhen auf den zugrunde liegenden Beobachtungen
  5. 5
    HerausforderungFehlende Kombinationen und Summen ausweisen
  6. 6
    BeispielKombinationen von Kategorien zählen
  7. 7
    ErklärungMit dem Nenner beginnen
  8. 8
    HerausforderungUngleich große Gruppen vergleichen
  9. 9
    VerbindungEine Kreuztabelle kann Werte zusammenfassen
  10. 10
    HerausforderungDie Tabelle für einen Bericht wählen
  11. 11
    ZusammenfassungFunktion und Population gemeinsam betrachten

Gruppierung und Aggregation mit pandas: Übungsaufgaben

50 Übungsfragen in 5 Sets

Set 1: Zeilenkontext nutzen und Verteilungen vergleichen10 Übungsfragen

Frage 1 von 10

Eine Gruppierung g wurde bereits erstellt. Welcher Ausdruck gibt an, wie viele Gruppen sie enthält?
  1. g.count()
  2. g.ngroups
  3. g.size()
  4. len(g.groups.keys()) + 1
Antwort zeigenAntwort ausblenden
Antwort: B
ngroups ist die Anzahl der Gruppen in einem GroupBy-Objekt. size() gibt dagegen für jede Gruppe eine separate Zeilenanzahl zurück. count() gibt ebenfalls Ergebnisse pro Gruppe zurück, zählt aber die erfassten Werte jeder ausgewählten Spalte, statt eine einzelne Gruppenanzahl anzugeben.

Frage 2 von 10

Eine Series hat die Zeilenbezeichnungen 10 und 20 mit den Werten 5 und 8. Ihre Series als Schlüssel hat den Index 20 und 10 mit den jeweiligen Werten „outer“ und „inner“. Wie lauten die Gruppensummen?
  1. Outer 5; inner 8
  2. Outer 13; inner 13
  3. Outer 8; inner 5
  4. Outer 0; inner 13
Antwort zeigenAntwort ausblenden
Antwort: C
Eine Series als Schlüssel wird anhand der Indexbezeichnung an den Daten ausgerichtet. Die Bezeichnung 20 erhält daher den Schlüssel „outer“ und trägt 8 bei, während die Bezeichnung 10 „inner“ erhält und 5 beiträgt. Eine Zuordnung der beiden Series nach ihren angezeigten Positionen würde die Gruppen vertauschen und die Ausrichtung anhand von Bezeichnungen in pandas ignorieren.

Frage 3 von 10

Eine Gruppe hat 2 erfasste Werte mit dem arithmetischen Mittel 10; eine andere hat 6 erfasste Werte mit dem arithmetischen Mittel 20. Wie lautet das arithmetische Mittel über alle 8 Werte?
  1. 17,5
  2. 15,0
  3. 20,0
  4. 30,0
Antwort zeigenAntwort ausblenden
Antwort: A
Die erste Gruppe trägt die Summe 20 und die zweite die Summe 120 bei. Ihre gemeinsame Summe 140 dividiert durch acht Beobachtungen ergibt 17,5. Das direkte Mitteln von 10 und 20 ergibt 15, weil es Gruppen mit unterschiedlich vielen Beobachtungen dasselbe Gewicht gibt.

Frage 4 von 10

Eine benutzerdefinierte Aggregation erhält die Messwerte 3, 7 und 14. Was gibt lambda s: s.max() - s.min() zurück?
  1. 7
  2. 8
  3. 24
  4. 11
Antwort zeigenAntwort ausblenden
Antwort: D
Das Maximum ist 14 und das Minimum 3, also beträgt die zurückgegebene Spannweite 11. Die Funktion reduziert die Series der Gruppe auf einen Wert. Ein Ergebnis von 8 würde die letzten beiden sortierten Werte voneinander subtrahieren und das Minimum der Gruppe auslassen; es würde daher nicht die Spannweite messen.

Frage 5 von 10

Ein DataFrame hat ganzzahlige Zeilenbezeichnungen. Warum kann die direkte Zuweisung seiner nach Region indizierten Summen-Series als neue Spalte fehlende Werte erzeugen?
  1. Die Summe wandelt ganzzahlige Bezeichnungen in Regionsnamen um.
  2. Die Zuweisung gleicht Zeilenbezeichnungen mit dem Index der Zusammenfassung ab.
  3. Eine Summen-Series speichert nur Text statt numerischer Werte.
  4. Die Gruppierung überschreibt den Zeilenindex vor der Zuweisung.
Antwort zeigenAntwort ausblenden
Antwort: B
Die Zuweisung richtet die eingehende Series anhand der Indexbezeichnung aus. Regionsnamen in einer Zusammenfassung stimmen nicht mit den ursprünglichen ganzzahligen Zeilenbezeichnungen überein, sodass diese Zeilen keinen passenden Wert erhalten. Die Gruppierung hat den Index des DataFrames nicht überschrieben; eine Transformation oder ein Verbund über die Region liefert die benötigte Ausrichtung.

Frage 6 von 10

Ein Gruppenfilter soll eine Werkstatt nur behalten, wenn jeder erfasste Wert von delay unter 4 liegt. Welches Prädikat liefert eine Entscheidung pro Gruppe?
  1. lambda g: g["delay"] < 4
  2. lambda g: (g["delay"] < 4).any()
  3. lambda g: (g["delay"] < 4).all()
  4. lambda g: g["delay"].count() < 4
Antwort zeigenAntwort ausblenden
Antwort: C
all() fasst die Zeilenvergleiche zu einem booleschen Wert zusammen und verlangt, dass jeder Vergleich erfüllt ist. any() würde eine Werkstatt schon behalten, wenn nur eine Verzögerung unter 4 läge. Die Rückgabe der Vergleichs-Series selbst liefert nicht die einzelne Gruppenentscheidung, die filter benötigt.

Frage 7 von 10

Eine gruppierte apply-Funktion gibt für jede Gruppe eine Series mit dem Index low und high zurück. Welche Struktur erstellt pandas?
  1. Eine Series mit nur den zwei Werten der ersten Gruppe
  2. Einen DataFrame mit der ursprünglichen Eingabezeilenanzahl
  3. Einen DataFrame mit Gruppen als Spalten und ursprünglichen Zeilen
  4. Einen DataFrame mit einer Zeile pro Gruppe und zwei Spalten
Antwort zeigenAntwort ausblenden
Antwort: D
Übereinstimmende Series-Bezeichnungen werden zu Ergebnisspalten, mit einer Zeile für jede Gruppe. Hier heißen diese Spalten low und high. Ein Ergebnis mit der ursprünglichen Eingabezeilenanzahl würde eine an den Zeilen ausgerichtete Operation erfordern; diese Funktion liefert stattdessen zwei zusammenfassende Einträge pro Gruppe und nicht einen Wert für jede Eingabezeile.

Frage 8 von 10

Monatliche Lieferzeiten sollen in vier Gruppen mit annähernd gleicher Anzahl von Beobachtungen eingeteilt werden. Welche Operation passt?
  1. pd.qcut(times, 4)
  2. pd.cut(times, 4)
  3. times.quantile(0.4)
  4. times.groupby(times).size()
Antwort zeigenAntwort ausblenden
Antwort: A
qcut verwendet Stichprobenquantile, um Gruppen mit annähernd gleicher Besetzungszahl zu bilden. Gleiche Werte können verhindern, dass die Anzahlen exakt gleich sind. cut(times, 4) bildet dagegen Intervalle gleicher Breite, die bei einer ungleichmäßigen Verteilung der Lieferzeiten sehr unterschiedliche Beobachtungsanzahlen haben können.

Frage 9 von 10

Acht Temperaturen betragen 10, 11, 12, 13, 30, 31, 32, 33 °C. Standort A hat die ersten vier, Standort B die letzten vier. Wie wird 13 °C bei einer Aufteilung am Gesamtmedian und bei einer Aufteilung innerhalb von Standort A eingeordnet?
  1. Insgesamt oben; innerhalb von A unten
  2. Insgesamt unten; innerhalb von A unten
  3. Insgesamt unten; innerhalb von A oben
  4. Insgesamt oben; innerhalb von A oben
Antwort zeigenAntwort ausblenden
Antwort: C
Der Gesamtmedian beträgt 21,5 °C, sodass 13 °C zur unteren Hälfte aller Beobachtungen gehört. Der Median von Standort A beträgt 11,5 °C, sodass 13 °C dort zur oberen Hälfte gehört. Eine Einordnung in beiden Fällen als unten übersieht, dass die Referenzpopulation von allen Standorten zu Standort A allein wechselt.

Frage 10 von 10

Eine Häufigkeitstabelle hat die Zeilen X und Y und die Spalten P und Q: X hat 2 und 6; Y hat 3 und 1. Was zeigt die Zeile All bei Zeilennormierung und Randaggregaten für P und Q?
  1. 0,5 und 0,5
  2. 5/12 und 7/12
  3. 0,4 und 0,6
  4. 0,25 und 0,75
Antwort zeigenAntwort ausblenden
Antwort: B
Die Zeile All fasst die Spaltenverteilung der gesamten Stichprobe zusammen. Es gibt fünf P- und sieben Q-Beobachtungen von insgesamt zwölf, sodass sie 5/12 und 7/12 zeigt. Das arithmetische Mittel der beiden Zeilenanteile ergäbe 0,5 und 0,5 und würde die Gruppen mit acht und vier Zeilen fälschlich gleich gewichten.
Set 2: Gruppen verstehen und nützliche Zusammenfassungen wählen10 Übungsfragen

Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.

Frage 1 von 10

Eine Tabelle enthält die Teambezeichnungen Delta, Echo, Delta und die Stückzahlen 6, 5, 9. Was ergibt die Gruppierung nach Team mit anschließender Summierung der Stückzahlen?
  1. Delta 15; Echo 5
  2. Delta 6; Echo 14
  3. Delta 20; Echo 20
  4. Delta 7,5; Echo 5
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 2 von 10

Ein DataFrame hat die Spalten site und material. Wie gruppierst du nach jeder Kombination dieser beiden Spalten?
  1. df.groupby(("site", "material"))
  2. df.groupby("site")["material"]
  3. df.groupby(["site", "material"])
  4. df.groupby("site").get_group("material")
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 3 von 10

Eine gruppierte Summe wird als DataFrame mit site und mass_kg als normalen Spalten benötigt. Welcher Aufruf erzeugt diesen Aufbau?
  1. df.groupby("site", sort=False)["mass_kg"].sum()
  2. df.groupby("site", as_index=False)["mass_kg"].sum()
  3. df.groupby("site", dropna=False)["mass_kg"].sum()
  4. df.groupby("site", observed=False)["mass_kg"].sum()
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 4 von 10

Eine Charge hat die Messwerte 8, fehlend, 12, fehlend. Wie lauten ihr size() und das count() der Messwerte?
  1. Zeilenanzahl 2; Messwertanzahl 4
  2. Zeilenanzahl 4; Messwertanzahl 4
  3. Zeilenanzahl 2; Messwertanzahl 2
  4. Zeilenanzahl 4; Messwertanzahl 2
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 5 von 10

Du benötigst eine Zeile pro Maschine mit den Spalten peak und average aus load. Welche benannte Aggregation passt?
  1. .agg(peak=("load", "max"), average=("load", "mean"))
  2. .agg(load=("peak", "max"), average=("load", "mean"))
  3. .agg(peak=("load", "mean"), average=("load", "max"))
  4. .agg(peak=("max", "load"), average=("mean", "load"))
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 6 von 10

Drei Datensätze eines Labors enthalten die Energiemesswerte 4, 6 und 10 kWh. Welchen Wert soll die Zeile mit 6 kWh erhalten, wenn jeder Messwert durch die übertragene Laborsumme dividiert wird?
  1. 0,60
  2. 0,20
  3. 0,30
  4. 0,50
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 7 von 10

Die Zeilen stehen in Ereignisreihenfolge: Gruppe A hat den Wert 7, Gruppe B hat 3 und danach hat Gruppe A den Wert 5. Wie lautet die gruppierte kumulative Summe in dieser Zeilenreihenfolge?
  1. 7, 10, 15
  2. 7, 3, 12
  3. 12, 3, 12
  4. 0, 0, 1
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 8 von 10

In welche Klasse fällt der Wert 40 bei pd.cut(x, [0, 20, 40, 60]) mit dem standardmäßigen Intervallabschluss?
  1. (0, 20]
  2. (40, 60]
  3. In keine Klasse
  4. (20, 40]
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 9 von 10

Einer Zelle sind zwei Lieferdauern von 12 und 18 Minuten zugeordnet. Was enthält die Zelle einer pivot_table, wenn aggfunc weggelassen wird?
  1. 15 Minuten
  2. 30 Minuten
  3. 2 Lieferungen
  4. 18 Minuten
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 10 von 10

Eine Umfrage umfasst 9 Beschäftigte im Homeoffice, von denen 6 Rad fahren, und 3 vor Ort Beschäftigte, von denen 2 Rad fahren. Eine Kreuztabelle enthält den Arbeitsort in den Zeilen und die Fortbewegungsart in den Spalten. Welches normierte Ergebnis beantwortet „Welcher Anteil der Radfahrenden arbeitet im Homeoffice?“
  1. normalize="index"; 6/9
  2. normalize="all"; 6/12
  3. normalize="index"; 2/3
  4. normalize="columns"; 6/8
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Set 3: Ergebnisformen und Entscheidungen an Grenzen prüfen10 Übungsfragen

Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.

Frage 1 von 10

Ein kategorialer Schlüssel führt A, B und C auf, aber die Daten enthalten nur A und B. Welche Einstellung nimmt C in pandas 3 in eine gruppierte Zusammenfassung auf?
  1. dropna=False
  2. as_index=False
  3. sort=False
  4. observed=False
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 2 von 10

Zwei Wertespalten werden mit ["sum", "mean"] aggregiert. Welche Bezeichnungen haben die Ergebnisspalten?
  1. Paare aus Eingabespaltenname und Funktionsname
  2. Nur die beiden ursprünglichen Eingabespaltennamen
  3. Paare aus Gruppenschlüsselwert und Eingabezeilenbezeichnung
  4. Nur die beiden gewählten Aggregationsfunktionsnamen
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 3 von 10

Ein Lieferant verschickt 2 kg zu einem Preis pro Einheit von 9 und 8 kg zu einem Preis pro Einheit von 4. Wie hoch ist der durchschnittliche Preis pro Kilogramm für die gesamte Lieferung?
  1. 6,5
  2. 4,0
  3. 5,0
  4. 5,5
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 4 von 10

Die Werte einer Gruppe lauten der Reihe nach 12, 9 und 15. Was gibt das gruppierte pct_change() zurück?
  1. Fehlend, −3, 6
  2. Fehlend; −0,25; etwa 0,667
  3. 0; −0,25; 0,5
  4. Fehlend; −0,333; 0,4
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 5 von 10

Eine Tabelle ist unsortiert. Du benötigst die zwei Zeilen mit dem größten Wert in mass_kg aus jeder batch. Welches Vorgehen passt?
  1. Nach Charge gruppieren, dann tail(2) verwenden.
  2. Chargennamen sortieren, dann head(2) verwenden.
  3. Nach Charge gruppieren, dann Gruppen der Größe 2 filtern.
  4. Masse absteigend sortieren, dann gruppiertes head(2) verwenden.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 6 von 10

Eine Funktion f sortiert jede Gruppe nach Qualität und gibt zwei Zeilen zurück. Was solltest du bei df.groupby("batch", group_keys=False).apply(f) erwarten, bevor du das Ergebnis zurückzuweist?
  1. Ursprüngliche Bezeichnungen, Zeilen gruppenweise ausgewählt und geordnet
  2. Ursprüngliche Zeilenreihenfolge, alle Eingabezeilen erhalten
  3. Eine nach Charge indizierte Series mit einem Skalar pro Gruppe
  4. Ein neuer ganzzahliger Index, alle Eingabezeilen erhalten
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 7 von 10

Ein Bericht verwendet pd.cut(x, [0, 10, 20], right=False). Welche der Werte 0, 10 und 20 erhalten eine Klasse?
  1. Nur 10 und 20
  2. Nur 0 und 20
  3. Nur 0 und 10
  4. Alle drei Werte
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 8 von 10

Die Werte sind 2, 2, 2, 2, 2, 2, 6, 10. Quartilgrenzen wiederholen sich. Welche Folge hat qcut(..., 4, duplicates="drop") im Vergleich zu einer vorherigen Rangvergabe mit method="first"?
  1. Grenzen entfernen behält vier Klassen und löst Rangbindungen auf.
  2. Grenzen entfernen verringert die Klassenanzahl; Rangvergabe kann gleiche Werte trennen.
  3. Grenzen entfernen entfernt gleiche Zeilen; Rangvergabe behält sie.
  4. Grenzen entfernen nutzt feste Breiten; Rangvergabe nutzt Quartile.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 9 von 10

Ein Bericht mit festen Punktzahlbereichen muss neben belegten auch einen leeren Bereich anzeigen. Welche Einstellung und welches Ergebnis stellen Anzahlen und Mittelwerte korrekt dar?
  1. observed=True; Anzahl 0, Mittelwert 0
  2. dropna=False; Anzahl 1, Mittelwert fehlend
  3. observed=False; Anzahl 0, Mittelwert fehlend
  4. as_index=False; Anzahl fehlend, Mittelwert 0
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 10 von 10

Mehrere Beobachtungen haben dieselben Zeilen- und Spaltenschlüssel. Du benötigst eine Summe pro Zelle. Welche Operation passt?
  1. pivot mit der Wertespalte
  2. unstack auf den unveränderten Zeilen
  3. crosstab ohne eine Wertespalte
  4. pivot_table mit aggfunc="sum"
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Set 4: Zuverlässige gruppierte Berichte erstellen10 Übungsfragen

Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.

Frage 1 von 10

Ein Notebook speichert g = df.groupby("team")[["items"]]. Welches Objekt gibt g.sum() zurück?
  1. Eine Series mit einer Summe pro Team
  2. Einen DataFrame mit einer Spalte items
  3. Einen DataFrame mit jeder ursprünglichen Zeile
  4. Eine Series mit jeder ursprünglichen Zeile
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 2 von 10

Ein DataFrame hat die Indexbezeichnungen a, b, c und die Beträge 5, 8, 12. Eine Series als Schlüssel hat die Bezeichnungen c und a mit den Werten „R“ und „S“. Welche gruppierten Summen ergeben sich mit dropna=False?
  1. R 5; S 8; fehlend 12
  2. R 12; S 13; keine Gruppe für fehlende Schlüssel
  3. R 12; S 5; fehlend 8
  4. R 17; S 8; keine Gruppe für fehlende Schlüssel
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 3 von 10

Eine einzelne Gruppe enthält einen erfassten Wert, 11. Was gibt ihr gruppiertes std() standardmäßig zurück?
  1. 0.0
  2. 11.0
  3. 1.0
  4. NaN
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 4 von 10

Zwei Prüfungen erfassen Fehlerkennzeichen True, False für Werk A und True, True, False, False, False, False für Werk B. Welcher Anteil aller geprüften Gegenstände ist fehlerhaft?
  1. 3/8
  2. 1/2
  3. 5/12
  4. 1/3
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 5 von 10

Welche Umsetzung gibt den Anteil der Messwerte von mindestens 16 in jeder Gruppe zurück, ohne eine Python-Funktion pro Gruppe aufzurufen?
  1. df.groupby("batch")["reading"].mean() >= 16
  2. df.assign(hit=df["reading"] >= 16).groupby("batch")["hit"].sum()
  3. df.assign(hit=df["reading"] >= 16).groupby("batch")["hit"].mean()
  4. df.groupby("batch")["reading"].count() / len(df)
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 6 von 10

Die Zeilen für Gruppe und Betrag lauten A:4, B:9, A:12, B:3. Eine neue Spalte soll für jede Zeile ihren Anteil an der Summe ihrer eigenen Gruppe zeigen. Welche Werte erscheinen in Zeilenreihenfolge?
  1. 0,25; 0,25; 0,75; 0,75
  2. 1/7, 9/28, 3/7, 3/28
  3. 0,5; 0,5; 0,5; 0,5
  4. 0,25; 0,75; 0,75; 0,25
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 7 von 10

Unsortierte Ereignisse sind U bei Schritt 2 mit Wert 15, V bei Schritt 1 mit 8 und U bei Schritt 1 mit 10. Welche gruppierte Differenz gehört nach dem Sortieren nach Schritt zur Zeile von U bei Schritt 2 und warum?
  1. −5; den nächsten Wert von U verwenden
  2. 5; den Wert von U bei Schritt 1 subtrahieren
  3. 7; den vorhergehenden Wert von V subtrahieren
  4. 15; bei jedem Ereignis neu beginnen
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 8 von 10

Feste Bereiche müssen 0 und 100 einschließen und 50 dem unteren von zwei Bereichen zuordnen. Welcher Aufruf passt?
  1. pd.cut(x, [0, 50, 100], right=False)
  2. pd.cut(x, [0, 50, 100], include_lowest=True)
  3. pd.cut(x, [0, 50, 100])
  4. pd.cut(x, [0, 50, 101], right=False)
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 9 von 10

Die sortierten Werte sind 4, 8, 12, 24, 40. Wie groß ist das 0,6-Quantil bei der standardmäßigen Interpolation von pandas?
  1. 16,8
  2. 24,0
  3. 19,2
  4. 12,0
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 10 von 10

Eine Pivot-Tabelle mit arithmetischen Mitteln hat zwei belegte Zellen in einer Zeile: Eine hat aus 1 Beobachtung den Mittelwert 10, die andere aus 3 Beobachtungen den Mittelwert 30. Alle Werte und Schlüssel sind erfasst. Wie groß ist das Randaggregat dieser Zeile?
  1. 20
  2. 40
  3. 25
  4. 30
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Set 5: Gruppierte Analysen und Vergleiche untersuchen10 Übungsfragen

Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.

Frage 1 von 10

Die Beträge unter den Schlüsseln A und B sind 7 und 11, hinzu kommt 6 mit fehlendem Schlüssel. Der Schlüssel ist kategorial und hat eine unbenutzte Kategorie C. Welche Einstellungen erhalten die Summe 24 und zeigen auch C an?
  1. dropna=True, observed=False
  2. dropna=False, observed=True
  3. dropna=True, observed=True
  4. dropna=False, observed=False
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 2 von 10

In pandas 3 hat eine Gruppe die Werte 2 und 6. Warum können .agg("std") und .agg(np.std) unterschiedliche Ergebnisse liefern?
  1. Der Aufruf mit Zeichenkette nutzt den Stichprobendivisor; NumPy nutzt den Divisor für die Grundgesamtheit.
  2. Der Aufruf mit Zeichenkette nutzt den Divisor für die Grundgesamtheit; NumPy nutzt den Stichprobendivisor.
  3. Der Aufruf mit Zeichenkette rundet Eingabewerte; NumPy erhält Eingabewerte.
  4. Der Aufruf mit Zeichenkette berechnet Varianz; NumPy berechnet Standardabweichung.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 3 von 10

Eine Station hat die Messwerte 2 und 14, eine andere 9, 9 und 9. Du benötigst alle ursprünglichen Zeilen von Stationen, deren arithmetisches Mittel größer als 8 ist. Was soll bleiben?
  1. Nur die Zeile mit 14 der ersten Station
  2. Alle fünf Zeilen beider Stationen
  3. Alle drei Zeilen der zweiten Station
  4. Eine zusammenfassende Zeile der zweiten Station
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 4 von 10

Wo kann eine Funktion, die an ein gruppiertes apply auf einem DataFrame übergeben wird, seit pandas 3.0 ihren aktuellen Gruppenschlüssel lesen?
  1. g.columns
  2. g.name
  3. g.index.name
  4. g.shape
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 5 von 10

Ein Bericht teilt Lernstunden in Klassen ein und zeigt mittlere Punktzahlen von 60 und 85 bei den Anzahlen 20 und 2. Welche Schlussfolgerung wird durch diese Ergebnisse gestützt?
  1. Zusätzliches Lernen verursachte bei jedem Lernenden einen Anstieg um 25 Punkte.
  2. Der obere Bereich ist zuverlässiger, weil sein Mittelwert höher ist.
  3. Alle Lernenden im oberen Bereich erzielten mehr Punkte als alle anderen.
  4. Die Mittelwerte unterscheiden sich; der obere beruht auf nur zwei Punktzahlen.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 6 von 10

Eine Kreuztabelle hat Abteilungen in den Zeilen und Ergebnisse in den Spalten. Abteilung J hat 18 bestanden, 6 nicht bestanden; K hat 12 bestanden, 4 nicht bestanden. Wie groß ist der Anteil von J unter den nicht bestandenen Fällen und wie hoch ist die Nichtbestehensrate innerhalb von J?
  1. 60 % und 25 %
  2. 25 % und 60 %
  3. 75 % und 60 %
  4. 60 % und 75 %
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 7 von 10

Ein Team verwendet apply(lambda s: s - s.mean()) auf einer gruppierten numerischen Series, setzt dann den Index des Ergebnisses zurück und weist dessen Werte nach Position der ursprünglichen unsortierten Tabelle zu. Warum kann die neue Spalte falsch sein?
  1. Die Berechnung nutzt ein Gesamtmittel statt der Gruppenmittelwerte.
  2. Das Zurücksetzen des Index wandelt alle Abweichungen in Gruppensummen um.
  3. Das gruppenweise Zusammenfügen kann Werte falschen Eingabezeilen zuordnen.
  4. Ein apply-Ergebnis lässt immer die erste Beobachtung jeder Gruppe aus.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 8 von 10

Eine benutzerdefinierte Aggregation verwendet len(s) auf den Werten 5, fehlend, 7. Was gibt sie zurück und was misst diese Zahl?
  1. 2; erfasste Werte
  2. 3; erfasste Werte
  3. 2; Zeilen in der Gruppe
  4. 3; Zeilen in der Gruppe
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 9 von 10

Gruppe A hat die Werte 2, fehlend, 8; Gruppe B hat 20, fehlend, 40. Wie groß ist das arithmetische Mittel der sechs vervollständigten Werte, nachdem mit dem jeweils übertragenen Gruppenmittelwert aufgefüllt wurde?
  1. 17,5
  2. Etwa 11,667
  3. 20,0
  4. 15,0
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 10 von 10

Eine Zelle einer Pivot-Tabelle mit arithmetischen Mitteln hat keine Beobachtungen. Warum kann fill_value=0 Leserinnen und Leser in die Irre führen?
  1. Es zählt die leere Zelle als eine neue Eingabezeile.
  2. Es stellt einen nicht beobachteten Mittelwert als gemessene null dar.
  3. Es entfernt die gesamte Kategorie aus der Tabelle.
  4. Es wandelt alle nicht leeren Mittelwerte in Summen um.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Hängst du bei deiner eigenen Aufgabe fest? Hausaufgabenhilfe

Schlüsselbegriffe

68 Schlüsselbegriffe, jeweils mit Definition

A

Abweichung vom Gruppenmittelwert
Eine Abweichung vom Gruppenmittelwert ist ein Wert minus dem arithmetischen Mittel seiner eigenen Gruppe; sie zeigt, wie weit er über oder unter diesem Mittelwert liegt.
Eine positive Abweichung vom Gruppenmittelwert kennzeichnet eine Bestellung mit einem Umsatz über dem Durchschnitt ihrer Region.
Aggregation
Eine Aggregation reduziert eine Gruppe von Beobachtungen auf einen zusammenfassenden Wert pro ausgewählter Spalte, etwa eine Summe, eine Anzahl oder ein arithmetisches Mittel.
Eine Aggregation von Bestellmengen nach Lager ergibt eine Gesamtmenge für jedes Lager.
Aggregationsdictionary
Ein Aggregationsdictionary ordnet Eingabespalten eines DataFrames Funktionen zu und ermöglicht unterschiedliche Zusammenfassungen für verschiedene Größen.
Ein Aggregationsdictionary kann eine Summe für Einheiten sowie ein arithmetisches Mittel und ein Maximum für die Dauer anfordern.
Aggregationsfunktion
Eine Aggregationsfunktion bestimmt, wie eine Zelle einer Pivot-Tabelle ihre Beobachtungen zusammenfasst, etwa durch ein arithmetisches Mittel, eine Summe oder eine Anzahl.
Wird die Aggregationsfunktion auf sum gesetzt, enthält eine Zelle mit wiederholten Schlüsseln statt des durchschnittlichen Umsatzes den Gesamtumsatz.
Anzahl nicht fehlender Werte
Die Anzahl nicht fehlender Werte misst, wie viele erfasste Werte eine ausgewählte Spalte innerhalb einer Gruppe hat; fehlende Einträge werden ausgeschlossen.
Die Anzahl nicht fehlender Werte ist drei, wenn eine Charge mit fünf Zeilen nur drei erfasste Temperaturen enthält.
Anzahl unterschiedlicher Werte
Die Anzahl unterschiedlicher Werte misst, wie viele verschiedene Werte in einer Gruppe vorkommen; pandas nunique() schließt fehlende Werte standardmäßig aus.
Die Anzahl unterschiedlicher Produkte pro Region zeigt, wie viele Produktarten jede Region verkauft hat.
Aufrufbares Objekt
Ein aufrufbares Objekt ist eine Funktion oder ein ähnliches Objekt, das pandas auf gruppierte Werte anwenden kann und das seine eigenen Berechnungsregeln verwendet.
Ein aufrufbares Objekt wie np.std kann einen anderen standardmäßigen Divisor verwenden als die pandas-Funktion mit der Zeichenkette "std".
Ausrichtung anhand von Indexbezeichnungen
Die Ausrichtung anhand von Indexbezeichnungen ordnet pandas-Objekte beim Kombinieren oder Zuweisen von Werten anhand ihrer Indexbezeichnungen einander zu; das gilt auch für Series als Gruppierungsschlüssel.
Die Ausrichtung anhand von Indexbezeichnungen ordnet einen Schlüssel mit der Zeilenbezeichnung 8 der Datenzeile 8 zu, auch wenn die Schlüssel-Series in einer anderen Reihenfolge angezeigt wird.

B

Benannte Aggregation
Eine benannte Aggregation legt Ausgabenamen zusammen mit Eingabespalten und zusammenfassenden Funktionen fest und erzeugt klar beschriftete Ergebnisse.
Eine benannte Aggregation erstellt in einem Bericht total_mass aus einer Summe und max_temperature aus einem Maximum.
Benutzerdefinierte Aggregation
Eine benutzerdefinierte Aggregation ist eine selbst geschriebene Funktion, die die Series einer Gruppe erhält und einen nützlichen zusammenfassenden Wert zurückgibt.
Eine benutzerdefinierte Aggregation kann den größten Wert einer Gruppe minus ihren kleinsten Wert als Spannweite ausgeben.
Beobachtete Kategorien
Beobachtete Kategorien sind kategoriale Werte, die tatsächlich in den Daten vorkommen, im Unterschied zu deklarierten Kategorien ohne Zeilen.
Beim Gruppieren eines kategorialen Schlüssels in pandas 3 erscheinen standardmäßig nur beobachtete Kategorien.
Broadcasting
Broadcasting wiederholt ein skalares Gruppenergebnis über die Zeilen der Gruppe hinweg und macht es für Berechnungen auf Zeilenebene verfügbar.
Das Broadcasting einer Gruppensumme mit transform gibt jeder Zeile den Nenner für ihren eigenen Anteil.

D

Doppelte Schlüsselkombination
Eine doppelte Schlüsselkombination liegt vor, wenn mehrere Zeilen dieselben Zeilen- und Spaltenschlüssel haben, die eine Zelle in einer Pivot-Tabelle bestimmen würden.
Eine doppelte Schlüsselkombination muss mit pivot_table aggregiert werden, bevor sie eine einzelne numerische Zelle belegen kann.

F

Fehlender Gruppierungsschlüssel
Ein fehlender Gruppierungsschlüssel ist ein nicht vorhandener Gruppierungswert, durch den eine Zeile standardmäßig ausgeschlossen wird oder bei dropna=False einer eigenen Gruppe angehört.
Ein fehlender Gruppierungsschlüssel in der Regionsspalte kann erklären, warum regionale Summen eine ansonsten erfasste Bestellung auslassen.
Filterung
Eine Filterung behält ausgewählte ursprüngliche Zeilen oder Gruppen und erhält ihre Zeilenbezeichnungen, statt sie durch Zusammenfassungen zu ersetzen.
Eine Filterung kann jede Bestellung aus Regionen behalten, die im Datensatz mindestens drei Bestellungen haben.
Flache Aggregationstabelle
Eine flache Aggregationstabelle enthält Gruppierungsschlüssel als normale Spalten und eine Zeile für jede zusammengefasste Schlüsselkombination.
Eine flache Aggregationstabelle mit Spalten für Standort und Gesamtmasse eignet sich für einen späteren Verbund über den Standort.
Freiheitsgrade
Freiheitsgrade sind die unabhängigen Informationen, die für die Schätzung der Streuung verfügbar sind; bei der Stichprobenvarianz ist ihre Anzahl um eins kleiner als die Anzahl der erfassten Werte.
Bei drei erfassten Messwerten beruht die standardmäßige Stichprobenvarianz auf zwei Freiheitsgraden.
Füllwert
Ein Füllwert ersetzt fehlende Ergebniszellen durch einen gewählten Anzeigewert, der die Bedeutung des Fehlens korrekt ausdrücken sollte.
Ein Füllwert von null kann in einer Anzahltabelle darstellen, dass keine Bestellungen vorliegen, einen nicht beobachteten Mittelwert aber falsch darstellen.

G

Geordnete kategoriale Daten
Geordnete kategoriale Daten bestehen aus Kategoriewerten mit einer ausdrücklichen Reihenfolge, etwa der Reihenfolge numerischer Klassen von niedrig nach hoch.
Geordnete kategoriale Daten halten die Punktzahlbezeichnungen fail, pass, merit, distinction in ihrer sinnvollen Reihenfolge.
Gesamtanteil
Ein Gesamtanteil dividiert die Anzahl einer Zelle durch die Gesamtsumme und beschreibt den Anteil dieser Kombination an allen Beobachtungen.
Ein Gesamtanteil von 0,2 bedeutet, dass die Kategorienkombination der Zelle 20 % der gesamten Tabelle ausmacht.
Gewichtetes arithmetisches Mittel
Ein gewichtetes arithmetisches Mittel gibt Beobachtungen entsprechend festgelegten Gewichten unterschiedlichen Einfluss, etwa anhand der Einheiten jeder Bestellung.
Ein gewichtetes arithmetisches Mittel von Bestellpreisen mit den Einheitenzahlen als Gewichten entspricht dem Gesamtumsatz dividiert durch die Summe der Einheiten.
GroupBy-Objekt
Ein GroupBy-Objekt enthält Gruppierungsinformationen und stellt Operationen bereit, die aus den Zeilen jeder Gruppe Ergebnisse berechnen.
Ein für Teams erstelltes GroupBy-Objekt kann später sowohl Gesamtsummen der Stückzahlen als auch durchschnittliche Lieferzeiten erzeugen.
Gruppenbezogener z-Wert
Ein gruppenbezogener z-Wert drückt die Abweichung eines Werts von seinem Gruppenmittelwert in Einheiten der Standardabweichung dieser Gruppe aus.
Ein gruppenbezogener z-Wert kann einen relativ hohen Messwert in einem Labor anzeigen, selbst wenn sein absoluter Wert mäßig ist.
Gruppenfilter
Ein Gruppenfilter behält oder entfernt eine ganze Gruppe anhand einer einzelnen booleschen Entscheidung und gibt für passende Gruppen die ursprünglichen Zeilen zurück.
Ein Gruppenfilter behält alle Datensätze von Stationen, deren durchschnittlicher Messwert eine Berichtsschwelle überschreitet.
Gruppenfunktion
Eine Gruppenfunktion erhält die Daten einer Gruppe und berechnet deren Ergebnis; das gruppierte apply kann ihr mehrere Spalten gemeinsam übergeben.
Eine Gruppenfunktion kann alle Spalten jeder Charge sortieren und ihre zwei Datensätze mit der höchsten Qualität zurückgeben.
Gruppenschlüssel
Gruppenschlüssel bezeichnen zurückgegebene Teile in einem gruppierten Ergebnis und können durch apply als äußere Indexebene hinzugefügt werden.
Gruppenschlüssel über den ursprünglichen Zeilenbezeichnungen zeigen, aus welcher Region jede ausgewählte Bestellung stammt.
Gruppenweise Stichprobe
Eine gruppenweise Stichprobe zieht Beobachtungen getrennt innerhalb jeder Gruppe und verwendet für jede Gruppe eine festgelegte Zeilenanzahl oder einen festgelegten Anteil.
Eine gruppenweise Stichprobe mit n=1 enthält einen Datensatz aus jeder nicht leeren Region, statt das Auslassen von Regionen zu riskieren.
Gruppenweises Anwenden mit apply
Das gruppenweise Anwenden mit apply führt eine Funktion auf jeder Gruppe aus und fasst skalare Ausgaben, Series oder DataFrames zu einem Ergebnis zusammen.
Das gruppenweise Anwenden mit apply kann eine Korrelation aus zwei Messspalten innerhalb der Beobachtungen jeder Lerngruppe berechnen.
Gruppierungsschlüssel
Ein Gruppierungsschlüssel ordnet jede Zeile einer Gruppe zu; mehrere Schlüssel ordnen Zeilen nach ihrer gemeinsamen Wertekombination zu.
Ein Gruppierungsschlüssel nach Materialart ordnet alle Aluminiumdatensätze derselben Analysegruppe zu.

H

Hierarchische Spalten
Hierarchische Spalten haben mehrere Bezeichnungsebenen, die oft jede Messvariable mit ihrer Aggregationsfunktion paaren.
Hierarchische Spalten unterscheiden einen Mittelwert der Einheiten von einem Mittelwert des Umsatzes, wenn beide Kennwerte zusammen erscheinen.

K

Klassen gleicher Breite
Klassen gleicher Breite teilen einen numerischen Bereich in Intervalle derselben Breite, ohne gleiche Beobachtungsanzahlen zu verlangen.
Klassen gleicher Breite können die meisten Lieferungen dem ersten Intervall zuordnen, wenn einzelne Verzögerungen extrem lang sind.
Klassenbasierte Analyse
Eine klassenbasierte Analyse fasst eine Variable innerhalb numerischer Bereiche einer anderen zusammen und gibt oft Anzahlen und Mittelwerte für jeden Bereich an.
Eine klassenbasierte Analyse vergleicht durchschnittliche Prüfungspunktzahlen von Lernenden in verschiedenen festen Lernstundenbereichen.
Klasseneinteilung
Die Klasseneinteilung wandelt numerische Beobachtungen in Intervallkategorien um, sodass Wertebereiche als Gruppenbezeichnungen dienen können.
Die Klasseneinteilung von Lieferdauern in feste Zeitbereiche erleichtert den Vergleich eines monatlichen Häufigkeitsberichts.
Klassengrenze
Eine Klassengrenze ist eine Grenze zwischen oder um Intervalle; benachbarte Grenzen definieren die möglichen Bereiche für Klassenzuordnungen.
Eine Klassengrenze bei 50 trennt zwei Punktzahlbereiche; die Regel für den Intervallabschluss bestimmt die Zuordnung des Werts 50.
Kreuztabelle
Eine Kreuztabelle, auch Kontingenztabelle genannt, ist eine Tabelle mit Häufigkeiten für Kombinationen kategorialer Variablen.
Eine Kreuztabelle nach Tarif und Gerät zählt, wie viele Nutzer zu jeder Kombination aus Tarif und Gerät gehören.
Kumulative Summe
Eine gruppierte kumulative Summe ist eine fortlaufende Summe, die der aktuellen Zeilenreihenfolge folgt und für jede Gruppe neu beginnt.
Die kumulative Summe verkaufter Einheiten beginnt neu, wenn die Bestellfolge einer anderen Region betrachtet wird.

L

Lambda-Ausdruck
Ein Lambda-Ausdruck definiert eine kurze anonyme Python-Funktion, die oft für eine kompakte benutzerdefinierte Gruppenberechnung verwendet wird.
Ein Lambda-Ausdruck kann den Anteil der Messwerte zurückgeben, die eine festgelegte Temperaturschwelle erreichen.
Lineare Interpolation
Lineare Interpolation schätzt einen Wert zwischen benachbarten Beobachtungen, indem sie den entsprechenden Anteil ihrer Differenz nimmt.
Lineare Interpolation kann ein Stichprobenperzentil zwischen zwei Punktzahlen setzen, auch wenn keine der beiden Punktzahlen diesem Perzentil entspricht.
Lückenloser Rang
Ein lückenloser Rang weist gleichen Werten denselben Rang und dem nächsten unterschiedlichen Wert die nächste ganze Zahl ohne Lücke zu.
Bei absteigender lückenloser Rangvergabe erhalten zwei gleiche höchste Messwerte Rang 1 und der nächstkleinere Messwert Rang 2.

M

Median
Der Median ist der mittlere Wert der sortierten erfassten Werte; bei gerader Anzahl erfasster Werte ist er das arithmetische Mittel der beiden Werte in der Mitte.
Der Median gruppierter Bestellbeträge kann weniger stark von einer einzelnen großen Bestellung beeinflusst werden als ihr arithmetisches Mittel.
Mittelwert boolescher Werte
Der Mittelwert boolescher Werte ist das arithmetische Mittel von True- und False-Werten, die als 1 und 0 interpretiert werden; er ergibt den Anteil der True-Werte.
Ein Mittelwert boolescher Fehlerkennzeichen ergibt für jede Charge den Anteil fehlerhafter Gegenstände statt ihrer Anzahl.
MultiIndex
Ein MultiIndex ist ein Index mit mehreren Ebenen, mit dem eine Zeilen- oder Spaltenbezeichnung eine Kombination von Schlüsselwerten darstellen kann.
Ein MultiIndex nach Region und Produkt bezeichnet eine Summe sowohl nach dem Ort einer Bestellung als auch nach ihrem Inhalt.

N

Normierung
Normierung wandelt absolute Häufigkeiten in Anteile um, indem sie diese durch eine gewählte Zeilen-, Spalten- oder Gesamtsumme dividiert.
Die Normierung nach Spalten vergleicht die Tarifzugehörigkeit getrennt unter Smartphone- und unter Laptop-Nutzern.

P

Pivot-Tabelle
Eine Pivot-Tabelle aggregiert Wertespalten für Kombinationen von Zeilen- und Spaltenschlüsseln und zeigt die Ergebnisse in einem zweidimensionalen Raster an.
Eine Pivot-Tabelle kann die Summe der verkauften Einheiten für jede Kombination aus Region und Produkt in einem Bericht anzeigen.
Prädikat
Ein Prädikat ist eine Funktion, die eine boolesche Entscheidung zurückgibt; ein GroupBy-Filterprädikat muss eine Entscheidung pro Gruppe liefern.
Ein Prädikat mit all() kann verlangen, dass jeder Messwert einer Gruppe dieselbe Qualitätsbedingung erfüllt.

Q

Quantil
Ein Quantil bezeichnet eine bestimmte relative Position in sortierten Daten; pandas kann interpolieren, wenn diese Position zwischen Werten liegt.
Das 0,5-Quantil ist der Median einer Gruppe, während das 0,9-Quantil eine höhere relative Position bezeichnet.
Quantilanalyse
Eine Quantilanalyse vergleicht eine Messgröße zwischen Gruppen, die durch Quantilklassen definiert sind, etwa untere und obere Teile einer Stichprobe.
Eine Quantilanalyse kann die Sitzungsdauer für Kunden in jedem Viertel der Kaufbeträge zusammenfassen.
Quantilklasse
Eine Quantilklasse ist ein durch Stichprobenquantile begrenztes Intervall, das einen gewählten Anteil der Beobachtungen der Stichprobe enthalten soll.
Die numerischen Grenzen einer Quantilklasse für das obere Viertel der Kunden können sich in einer späteren Stichprobe ändern.
Quartil
Ein Quartil ist einer der Teilungspunkte einer Verteilung an den Viertelpositionen, üblicherweise bei den Wahrscheinlichkeiten 0,25, 0,5 und 0,75.
Stichprobenquartile als Grenzen ermöglichen es qcut, Beobachtungen in vier Gruppen mit annähernd gleicher Besetzungszahl einzuteilen.

R

Randaggregat
Ein Randaggregat ist eine zusammenfassende Zeile oder Spalte, die mit der Aggregationsfunktion der Pivot-Tabelle aus den zugrunde liegenden Beobachtungen berechnet wird.
Ein Randaggregat mit arithmetischen Mitteln gewichtet belegte Zellen nach ihren Beobachtungsanzahlen, weil es die zugrunde liegenden Zeilen mittelt.
Rang innerhalb der Gruppe
Ein Rang innerhalb der Gruppe beschreibt die Position eines Werts relativ zu anderen Werten seiner eigenen Gruppe nach einer gewählten Regel für Rangbindungen.
Ein absteigender Rang innerhalb der Gruppe gibt der größten Bestellung jeder Region Rang 1, ohne Zeilen zu verschieben.
Rangbindung
Eine Rangbindung entsteht, wenn Beobachtungen gleiche Werte haben; bleiben gleiche Werte zusammen, können Quantilklassen ungleiche Besetzungszahlen haben.
Eine Rangbindung an einem Stichprobenquartil kann dazu führen, dass mehrere gleiche Beobachtungen in ein Intervall fallen und ungleiche Besetzungszahlen entstehen.
Rechts abgeschlossenes Intervall
Ein rechts abgeschlossenes Intervall schließt seinen oberen Endpunkt ein; die Standardintervalle von cut schließen den linken Endpunkt aus und den rechten ein.
Das rechts abgeschlossene Intervall (20, 40] enthält den Wert 40, schließt aber den Wert 20 aus.
Referenzpopulation
Eine Referenzpopulation ist die Gesamtheit der für einen Vergleich verwendeten Beobachtungen, etwa alle Zeilen oder die Zeilen einer Teilgruppe.
Eine einzelne Lerngruppe als Referenzpopulation kann einer Punktzahl eine andere relative Bezeichnung geben als der vollständige Datensatz aller Lernenden.
Relative Änderung
Eine relative Änderung ist die Differenz zum vorherigen Wert, dividiert durch diesen vorherigen Wert und als Bruchteil ausgedrückt.
Eine relative Änderung von 0,15 bedeutet einen Anstieg um 15 % gegenüber der vorherigen Beobachtung derselben Gruppe.

S

Skalares Ergebnis
Ein skalares Ergebnis ist ein einzelner Wert, der für eine Gruppe zurückgegeben wird und den das gruppierte apply zu einer Series mit Gruppenschlüsseln als Index zusammenfasst.
Ein skalares Ergebnis aus der Preisberechnung jeder Region ergibt einen einzelnen regionalen Preis pro Einheit.
Spaltenanteil
Ein Spaltenanteil dividiert die Anzahl einer Zelle durch ihre Spaltensumme und beschreibt die Zeilenkategorie der Zelle innerhalb der Population dieser Spalte.
Ein Spaltenanteil in einer Tabelle nach Tarif und Gerät gibt den Anteil des Basistarifs unter allen Smartphone-Nutzern an.
Split-Apply-Combine
Split-Apply-Combine ist ein Muster, das zusammengehörige Zeilen gruppiert, jede Gruppe getrennt verarbeitet und ihre Ergebnisse zusammenführt.
Split-Apply-Combine macht aus einer Tabelle einzelner Bestellungen eine Gesamtmenge für jede Region.
Stichprobenstandardabweichung
Die Stichprobenstandardabweichung misst die Streuung um ein arithmetisches Mittel mit einem Divisor, der um eins kleiner als die Anzahl der erfassten Beobachtungen ist.
Bei einer Gruppe mit einem erfassten Messwert fehlt nach der Standardeinstellung von pandas die Stichprobenstandardabweichung.

T

Top-n-Auswahl
Eine Top-n-Auswahl behält nach der Sortierung nach der Messvariablen eine gewählte Anzahl der Zeilen mit den höchsten Werten pro Gruppe.
Eine Top-n-Auswahl von zwei Bestellungen pro Region kann eine absteigende Umsatzsortierung mit anschließendem gruppiertem head(2) verwenden.
Transformation
Eine gruppierte Transformation erzeugt Ergebnisse mit der Länge und dem Index der Eingabe, sodass Gruppeninformationen jede Zeile begleiten können.
Eine Transformation wiederholt die Summe einer Region in ihren Bestellzeilen, sodass jede Bestellung einen regionalen Anteil erhalten kann.

U

Umformen mit unstack
Das Umformen mit unstack ist eine Operation, die eine Indexebene in die Spalten verschiebt und indizierte Kombinationen in eine breitere Tabelle umwandelt.
Das Umformen mit unstack wandelt Produktbezeichnungen in einem gruppierten Index in Spalten neben den Summen jeder Region um.
Unbenutzte Kategorie
Eine unbenutzte Kategorie ist ein deklarierter kategorialer Wert, für den es im aktuellen Datensatz keine Beobachtungen gibt, der aber in einer Zusammenfassung erscheinen kann.
Eine unbenutzte Kategorie für ein Lager behält ihren Platz in einem Bericht, wenn observed=False gewählt wird.

V

Verzögerter Wert
Ein verzögerter Wert ist eine frühere Beobachtung, die innerhalb der gewählten Reihenfolge in eine spätere Zeile verschoben wird, getrennt für jede Gruppe.
Ein verzögerter Wert ermöglicht jeder Bestellung, ihre Einheiten mit der vorherigen Bestellung derselben Region zu vergleichen.

Z

Zeilenanteil
Ein Zeilenanteil dividiert die Anzahl einer Zelle durch ihre Zeilensumme und beschreibt die Spaltenkategorie der Zelle innerhalb der Population dieser Zeile.
Ein Zeilenanteil in einer Tabelle nach Tarif und Gerät gibt den Smartphone-Anteil unter den Nutzern des Basistarifs an.
Zeilenanzahl
Die Zeilenanzahl misst die Anzahl der Beobachtungen einer Gruppe, einschließlich solcher mit fehlenden Werten in Messspalten.
Die Zeilenanzahl bleibt fünf, auch wenn zwei der fünf Temperaturmesswerte einer Charge fehlen.
Zuordnung
Eine Zuordnung verbindet Eingabebezeichnungen oder -werte mit Ausgabeschlüsseln und ermöglicht es, mehrere ursprüngliche Kategorien einer größeren Gruppe zuzuweisen.
Eine Zuordnung von Regionen zu Zonen kann mehrere regionale Mengen zu einer Zonensumme zusammenfassen.
Zusammenhang
Ein Zusammenhang ist eine beobachtete Beziehung zwischen Variablen, etwa sich ändernde Gruppenmittelwerte über Klassen hinweg, ohne dass damit eine Ursache belegt ist.
Ein Zusammenhang zwischen Lernstundenbereichen und mittleren Punktzahlen kann auch andere Unterschiede zwischen den Lernenden widerspiegeln.

Über diese Einheit

Von StudeliFehler melden

Erstelle deine eigenen Lernmaterialien

Mach aus deinen Notizen, Folien und Dokumenten Lernleitfäden, Übungsfragen, Karteikarten und 6 weitere Tools.

Jetzt starten