- Lernen
- Informatik & Informationswissenschaften
- Data Science & KI
- Datenanalyse mit Python – NumPy, pandas und Matplotlib
- Gruppierung und Aggregation mit pandas
Gruppierung und Aggregation mit pandas
MittelEinheit 5 von 8 in Kurs: Datenanalyse mit Python – NumPy, pandas und Matplotlib
Was du lernst
- 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ärenBeschreibe, 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 gruppierenWä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 steuernGestalte gruppierte Ergebnisse für die weitere Arbeit: Schlüssel als Index oder Spalten, sortierte Ausgabe, fehlende Schlüssel und unbenutzte Kategorien sowie klare Namen.
- Split-Apply-Combine und das GroupBy-Objekt erklären
- 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 nutzenBerechne 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 anwendenNutze agg mit Listen, Dictionaries und benannter Aggregation, um Aggregationstabellen mit klaren Spaltennamen zu erstellen.
- Eigene Aggregationsfunktionen schreibenSchreibe 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.
- Integrierte Aggregationsmethoden korrekt nutzen
- 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änzenNutze 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 berechnenNutze 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 ziehenFiltere 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ührenNutze 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.
- Mit transform jede Zeile um Gruppenkennwerte ergänzen
- 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 einteilenNutze 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 bildenBerechne Quantile, erstelle mit qcut quantilbasierte Klassen, vergleiche sie mit Klassen gleicher Breite und berücksichtige gleiche Werte.
- Durch Klassen und Quantile definierte Gruppen vergleichenNutze 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.
- Werte mit cut in Intervalle einteilen
- 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 erstellenFasse 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 vergleichenErstelle 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.
- Pivot-Tabellen mit pivot_table erstellen
Gruppierung und Aggregation mit pandas einfach erklärt
1Daten 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
levelfür Indexebenen undunstack, 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=Falselegt Aggregationsschlüssel in normalen Spalten ab.sortordnet Schlüssel;sort_valuesbringt berechnete Werte in eine Rangfolge.dropna=Falsebehält eine Gruppe für fehlende Schlüssel.observed=Falseschließt unbenutzte kategoriale Werte ein.
2Jede 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
sizezählt Zeilen;countzählt erfasste Werte.- Die meisten Reduktionen überspringen fehlende Werte; die Summe ausschließlich fehlender Werte ist standardmäßig null.
stdundvarverwenden standardmäßig den Divisor für Stichproben.- Wähle vor dem Aggregieren die relevanten numerischen Spalten aus.
firstkann 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.
3Gruppenweise 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
transformgibt 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.
cumcountbeginnt bei null; addiere 1 für übliche laufende Nummern.- Wähle bei Bedarf die Rangrichtung und die Methode für Rangbindungen ausdrücklich.
shift,diffundpct_changevergleichen Beobachtungen innerhalb derselben Gruppe.pct_changegibt 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
filtergibt ursprüngliche Zeilen aus Gruppen zurück, die ihre einzelne boolesche Bedingung erfüllen.head,tailundnthwählen Zeilen in der aktuellen Reihenfolge aus.- Sortiere vor
head, wenn du die größten Werte auswählst. - Eine gruppenweise Stichprobe mit
n=1berü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
applykann 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
applydie Gruppierungsspalten aus jeder Eingabegruppe aus. - Bevorzuge
agg,transformoderfilter, wenn ihre Ergebnisform passt. - Verwende
group_keys, um äußere Gruppenbezeichnungen zu steuern, nicht um die ursprüngliche Zeilenreihenfolge wiederherzustellen.
4Numerische 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
cutwandelt 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=Trueschließ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:
An Position 2 steht 55 und an Position 3 steht 64. Gehe drei Viertel des Abstands zwischen ihnen:
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
| Methode | Was legt die Grenzen fest? | Was bleibt vergleichbar? |
|---|---|---|
cut(x, n) | Gleiche Intervalle über den beobachteten Bereich | Numerische Breite |
cut(x, edges) | Ausdrücklich angegebene Grenzen | Die gewählten Bereiche |
qcut(x, n) | Quantile dieser Stichprobe | Ungefä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.
qcutverwendet 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=Falsebehä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.
5Daten 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:
| Region | coffee | tea |
|---|---|---|
| East | 20 | 9 |
| North | 28 | 48 |
| South | 68 | 12 |
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,valuesundaggfuncbestimmen 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_tablefür wiederholte Schlüsselkombinationen undpivotfü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
| Einstellung | Nenner | Bedeutung von basic–phone |
|---|---|---|
normalize="all" | Alle Beobachtungen | 4/10 = 0,4 |
normalize="index" | Zeilensumme basic | 4/6 ≈ 0,667 |
normalize="columns" | Spaltensumme phone | 4/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
crosstabzä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
valuesundaggfuncenthalten die Zellen statt Häufigkeiten eine numerische Zusammenfassung.
Gruppierung und Aggregation mit pandas: Beispiele
1Zeilen in nützliche Gruppen aufteilen
12 Schritte
- 1Einfü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.
- 2BeispielVier 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.
- 3Erklä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 undsum()legen fest, was aus dieser Gruppierung berechnet wird. - 4TippVor dem Berechnen untersuchen
Speichere
g = orders.groupby("region"), wenn mehrere Untersuchungen nützlich sind.g.ngroupsmeldet 2,g.size()meldet zwei Zeilen pro Region undg.get_group("West")zeigt die Beobachtungen von West.Die Auswahl
g["units"]ergibt ein SeriesGroupBy. Die Auswahlg[["units"]]behält die DataFrame-Form bei, obwohl nur eine Wertespalte ausgewählt ist. - 5HerausforderungEine 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.
- 6BeispielEinen 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. - 7VerbindungEin Schlüssel kann berechnet werden
orders.groupby(orders["units"] >= 5)["units"].sum()Der boolesche Schlüssel erzeugt eine Gruppe
Falsemit der Summe 3 und eine GruppeTruemit 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.
- 8HerausforderungEinen 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.
- 9Erklä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. - 10KernaussageFehlende 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=Truediese unbenutzte Kategorie aus;observed=Falsezeigt sie an.Eine Zeile ohne Region ist ein eigener Fall. Die Standardeinstellung
dropna=Trueschließt sie aus den Gruppen aus.dropna=Falsebehält eine Gruppe für fehlende Schlüssel. Die eine Option kann die andere nicht ersetzen. - 11HerausforderungDen 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ätzlichas_index=False, wenn der Bericht normale Schlüsselspalten benötigt. - 12ZusammenfassungSchlü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.
2Gruppenzusammenfassungen auswählen und benennen
13 Schritte
Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.
- 1EinführungEine Zusammenfassung muss eine Frage beantworten
- 2BeispielEine Charge mit einem fehlenden Wert betrachten
- 3ErklärungDie Standardeinstellungen der Reduktionen verstehen
- 4HerausforderungDie verfügbaren Messwerte zählen
- 5BeispielJede Ausgabe benennen
- 6ErklärungSpalten mit mehreren Funktionen verstehen
- 7HerausforderungDie Berichtsnamen korrigieren
- 8BeispielEine eigene Spannweite ergänzen
- 9TippEine boolesche Spalte vorbereiten
- 10BeispielDie gemessene Menge gewichten
- 11HerausforderungDen Preis pro Einheit ermitteln
- 12HerausforderungMittelwerte ungleich großer Gruppen kombinieren
- 13ZusammenfassungDie Bedeutung jedes Kennwerts erhalten
3Gruppenkontext den richtigen Zeilen zuordnen
16 Schritte
Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.
- 1EinführungEntscheiden, welche Zeilen die Antwort benötigt
- 2BeispielEine Summe übertragen
- 3BeispielSummen in Anteile umwandeln
- 4HerausforderungDen richtigen Füllwert wählen
- 5ErklärungZuerst die Reihenfolge festlegen
- 6BeispielMit der vorherigen Beobachtung vergleichen
- 7TippDie Regel für Rangbindungen wählen
- 8HerausforderungVerschachtelt auftretende Gruppen verfolgen
- 9BeispielAlle Zeilen einer passenden Gruppe behalten
- 10TippInnerhalb von Gruppen auswählen oder Stichproben ziehen
- 11HerausforderungEine Bedingung für die ganze Gruppe anwenden
- 12ErklärungDie Ergebnisform von apply vorhersagen
- 13BeispielMehrere Zeilen pro Gruppe zurückgeben
- 14HerausforderungEine Zeilenzuweisung korrigieren
- 15HerausforderungEine Gruppensumme mit einer Zeilenentscheidung verbinden
- 16ZusammenfassungDie Methode auf das Ergebnis abstimmen
4Numerische Bereiche erstellen und vergleichen
14 Schritte
Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.
- 1EinführungDie Bedeutung eines Bereichs festlegen
- 2BeispielFeste Intervalle erstellen
- 3ErklärungDie äußeren Werte abdecken
- 4TippBezeichnungen in Intervallreihenfolge halten
- 5HerausforderungWerte an Grenzen zuordnen
- 6ErklärungEin Stichprobenquantil bestimmen
- 7BeispielNach Besetzungszahl oder Breite aufteilen
- 8KernaussageGleiche Werte können die Klassenanzahl verändern
- 9HerausforderungStabile Grenzen wählen
- 10BeispielEine andere Variable zusammenfassen
- 11TippLeere Gruppen wahrheitsgetreu anzeigen
- 12HerausforderungDie Referenzpopulation ändern
- 13HerausforderungDen abschließenden Vergleich interpretieren
- 14ZusammenfassungVor dem Ergebnisvergleich die Bereiche lesen
5Zweidimensionale Summen und Anteile interpretieren
11 Schritte
Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.
- 1EinführungJeder Zelle eine Bedeutung geben
- 2BeispielEine kleine Pivot-Tabelle erstellen
- 3ErklärungDie Aggregation angeben
- 4KernaussageRandaggregate beruhen auf den zugrunde liegenden Beobachtungen
- 5HerausforderungFehlende Kombinationen und Summen ausweisen
- 6BeispielKombinationen von Kategorien zählen
- 7ErklärungMit dem Nenner beginnen
- 8HerausforderungUngleich große Gruppen vergleichen
- 9VerbindungEine Kreuztabelle kann Werte zusammenfassen
- 10HerausforderungDie Tabelle für einen Bericht wählen
- 11ZusammenfassungFunktion und Population gemeinsam betrachten
Gruppierung und Aggregation mit pandas: Übungsaufgaben
Set 1: Zeilenkontext nutzen und Verteilungen vergleichen10 Übungsfragen
Frage 1 von 10
g wurde bereits erstellt. Welcher Ausdruck gibt an, wie viele Gruppen sie enthält?Antwort zeigenAntwort ausblenden
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
Antwort zeigenAntwort ausblenden
Frage 3 von 10
Antwort zeigenAntwort ausblenden
Frage 4 von 10
lambda s: s.max() - s.min() zurück?Antwort zeigenAntwort ausblenden
Frage 5 von 10
Antwort zeigenAntwort ausblenden
Frage 6 von 10
delay unter 4 liegt. Welches Prädikat liefert eine Entscheidung pro Gruppe?Antwort zeigenAntwort ausblenden
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
apply-Funktion gibt für jede Gruppe eine Series mit dem Index low und high zurück. Welche Struktur erstellt pandas?Antwort zeigenAntwort ausblenden
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
Antwort zeigenAntwort ausblenden
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
Antwort zeigenAntwort ausblenden
Frage 10 von 10
All bei Zeilennormierung und Randaggregaten für P und Q?Antwort zeigenAntwort ausblenden
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
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 2 von 10
site und material. Wie gruppierst du nach jeder Kombination dieser beiden Spalten?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 3 von 10
site und mass_kg als normalen Spalten benötigt. Welcher Aufruf erzeugt diesen Aufbau?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 4 von 10
size() und das count() der Messwerte?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 5 von 10
peak und average aus load. Welche benannte Aggregation passt?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 6 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 7 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 8 von 10
pd.cut(x, [0, 20, 40, 60]) mit dem standardmäßigen Intervallabschluss?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 9 von 10
pivot_table, wenn aggfunc weggelassen wird?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 10 von 10
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
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 2 von 10
["sum", "mean"] aggregiert. Welche Bezeichnungen haben die Ergebnisspalten?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 3 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 4 von 10
pct_change() zurück?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 5 von 10
mass_kg aus jeder batch. Welches Vorgehen passt?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 6 von 10
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?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 7 von 10
pd.cut(x, [0, 10, 20], right=False). Welche der Werte 0, 10 und 20 erhalten eine Klasse?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 8 von 10
qcut(..., 4, duplicates="drop") im Vergleich zu einer vorherigen Rangvergabe mit method="first"?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 9 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 10 von 10
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
g = df.groupby("team")[["items"]]. Welches Objekt gibt g.sum() zurück?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 2 von 10
dropna=False?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 3 von 10
std() standardmäßig zurück?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 4 von 10
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?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 5 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 6 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 7 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 8 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 9 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 10 von 10
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
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 2 von 10
.agg("std") und .agg(np.std) unterschiedliche Ergebnisse liefern?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 3 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 4 von 10
apply auf einem DataFrame übergeben wird, seit pandas 3.0 ihren aktuellen Gruppenschlüssel lesen?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 5 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 6 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 7 von 10
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?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 8 von 10
len(s) auf den Werten 5, fehlend, 7. Was gibt sie zurück und was misst diese Zahl?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 9 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 10 von 10
fill_value=0 Leserinnen und Leser in die Irre führen?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Hängst du bei deiner eigenen Aufgabe fest? Hausaufgabenhilfe
Schlüsselbegriffe
A
Abweichung vom Gruppenmittelwert
Aggregation
Aggregationsdictionary
Aggregationsfunktion
Anzahl nicht fehlender Werte
Anzahl unterschiedlicher Werte
nunique() schließt fehlende Werte standardmäßig aus.Aufrufbares Objekt
np.std kann einen anderen standardmäßigen Divisor verwenden als die pandas-Funktion mit der Zeichenkette "std".Ausrichtung anhand von Indexbezeichnungen
B
Benannte Aggregation
total_mass aus einer Summe und max_temperature aus einem Maximum.Benutzerdefinierte Aggregation
Beobachtete Kategorien
Broadcasting
transform gibt jeder Zeile den Nenner für ihren eigenen Anteil.D
Doppelte Schlüsselkombination
pivot_table aggregiert werden, bevor sie eine einzelne numerische Zelle belegen kann.F
Fehlender Gruppierungsschlüssel
dropna=False einer eigenen Gruppe angehört.Filterung
Flache Aggregationstabelle
Freiheitsgrade
Füllwert
G
Geordnete kategoriale Daten
Gesamtanteil
Gewichtetes arithmetisches Mittel
GroupBy-Objekt
Gruppenbezogener z-Wert
Gruppenfilter
Gruppenfunktion
apply kann ihr mehrere Spalten gemeinsam übergeben.Gruppenschlüssel
apply als äußere Indexebene hinzugefügt werden.Gruppenweise Stichprobe
n=1 enthält einen Datensatz aus jeder nicht leeren Region, statt das Auslassen von Regionen zu riskieren.Gruppenweises Anwenden mit apply
Gruppierungsschlüssel
H
Hierarchische Spalten
K
Klassen gleicher Breite
Klassenbasierte Analyse
Klasseneinteilung
Klassengrenze
Kreuztabelle
Kumulative Summe
L
Lambda-Ausdruck
Lineare Interpolation
Lückenloser Rang
M
Median
Mittelwert boolescher Werte
MultiIndex
N
Normierung
P
Pivot-Tabelle
Prädikat
all() kann verlangen, dass jeder Messwert einer Gruppe dieselbe Qualitätsbedingung erfüllt.Q
Quantil
Quantilanalyse
Quantilklasse
Quartil
qcut, Beobachtungen in vier Gruppen mit annähernd gleicher Besetzungszahl einzuteilen.R
Randaggregat
Rang innerhalb der Gruppe
Rangbindung
Rechts abgeschlossenes Intervall
cut schließen den linken Endpunkt aus und den rechten ein.(20, 40] enthält den Wert 40, schließt aber den Wert 20 aus.Referenzpopulation
Relative Änderung
S
Skalares Ergebnis
apply zu einer Series mit Gruppenschlüsseln als Index zusammenfasst.Spaltenanteil
Split-Apply-Combine
Stichprobenstandardabweichung
T
Top-n-Auswahl
head(2) verwenden.Transformation
U
Umformen mit unstack
Unbenutzte Kategorie
observed=False gewählt wird.V
Verzögerter Wert
Z
Zeilenanteil
Zeilenanzahl
Zuordnung
Zusammenhang
Über diese Einheit
Erstelle deine eigenen Lernmaterialien
Mach aus deinen Notizen, Folien und Dokumenten Lernleitfäden, Übungsfragen, Karteikarten und 6 weitere Tools.