Einstieg in pandas
loc anhand von Bezeichnungen und mit iloc anhand von Positionen genau die Zeilen und Spalten aus, die du brauchst. Filtere Zeilen nach Bedingungen, füge Spalten hinzu und transformiere sie, sortiere Werte und weise ihnen Ränge zu. Fasse Daten mit deskriptiven Kennwerten, absoluten Häufigkeiten und Korrelation zusammen. Die Beispiele basieren auf pandas 3.MittelEinheit 2 von 8 in Kurs: Datenanalyse mit Python – NumPy, pandas und Matplotlib
Was du lernst
- Beschreibe, wie pandas ein- und zweidimensionale Daten mit Bezeichnungen speichert, erstelle Series und DataFrames aus Python-Daten und verwalte ihre Zeilen- und Spaltenbezeichnungen.
- Eine Series erstellen und ihren Index nutzenErstelle eine Series aus einer Liste oder einem Dictionary, lies ihre Werte, ihren Index, ihren Datentyp und ihren Namen aus und sage voraus, wie sich Bezeichnungen bei Arithmetik und beim Nachschlagen verhalten.
- Einen DataFrame erstellen und seinen Aufbau verstehenErstelle einen DataFrame aus Python-Daten, lies seine Form, Spalten, seinen Index und seine Datentypen aus, wähle eine Spalte als Series aus und verwende das Argument axis richtig.
- Bezeichnungen festlegen, zurücksetzen, umbenennen und entfernenWähle einen aussagekräftigen Zeilenindex, verschiebe ihn zurück in eine Spalte, benenne Zeilen oder Spalten um oder entferne sie und behalte die Ergebnisse durch erneute Zuweisung.
- Eine Series erstellen und ihren Index nutzen
- Lies eine CSV-Datei mit den passenden Optionen in einen DataFrame ein, untersuche das Ergebnis systematisch und wandle Spalten in die Datentypen um, die du für die Analyse brauchst.
- Eine CSV-Datei mit read_csv einlesenLade eine kommagetrennte Datei mit
pd.read_csv, verstehe, wie pandas Spaltentypen ermittelt, und verwende die Optionen für Trennzeichen, Dezimalzeichen, Kopfzeilen, fehlende Werte und Kennungen. - Einen neuen DataFrame untersuchenPrüfe eine frisch geladene Tabelle vor der Analyse mit
head,info,shape,dtypes, der Anzahl fehlender Werte und der Anzahl unterschiedlicher Werte. - Spalten in die passenden Datentypen umwandelnÄndere den Datentyp einer Spalte mit
astype,pd.to_numericundpd.to_datetimeund behalte die umgewandelte Spalte durch erneute Zuweisung.
- Eine CSV-Datei mit read_csv einlesen
- Wähle mit
locanhand von Bezeichnungen und mitilocanhand von Positionen genau die Zeilen, Spalten und Einzelwerte aus, die du brauchst, und sage Form und Typ jedes Ergebnisses voraus.- Zeilen und Spalten mit loc nach ihren Bezeichnungen auswählenVerwende
df.loc[rows, columns]mit einzelnen Bezeichnungen, Listen, Slices einschließlich beider Endpunkte und booleschen Masken und erkenne, wenn eine Bezeichnung nicht existiert. - Mit iloc nach Position auswählen und den passenden Indexer wählenVerwende
df.iloc[rows, columns]mit ganzzahligen Positionen, Slices ohne Endpunkt und negativen Positionen, lies Einzelwerte mitatundiataus und entscheide zwischen der Auswahl nach Bezeichnung und nach Position.
- Zeilen und Spalten mit loc nach ihren Bezeichnungen auswählen
- Behalte nur die Zeilen, die eine oder mehrere Bedingungen erfüllen. Verwende dazu boolesche Masken, Hilfsmethoden für häufige Tests und
queryund ändere Werte in ausgewählten Zeilen sicher.- Mit booleschen Masken filternErstelle aus einem Vergleich eine True/False-Maske, verknüpfe Bedingungen mit
&,|und~, zähle Treffer und verstehe, wie sich fehlende Werte bei Vergleichen verhalten. - Hilfsmethoden und query für häufige Filteraufgaben nutzenFiltere mit
isin,between,isna/notnaundstr.containsund schreibe dieselben Bedingungen als lesbarequery-Zeichenkette. - Werte in ausgewählten Zeilen sicher ändernAktualisiere Werte in Zeilen, die eine Bedingung erfüllen, mit einer einzigen
loc-Zuweisung und vermeide verkettete Zuweisungen, die in pandas 3 die ursprüngliche Tabelle nicht ändern.
- Mit booleschen Masken filtern
- Erstelle mit vektorisierter Arithmetik und
assignneue Spalten aus vorhandenen und kodiere oder transformiere Werte mitnp.where,map,applyundreplace.- Neue Spalten aus vorhandenen Spalten berechnenFüge mit vektorisierter Arithmetik eine Spalte hinzu oder überschreibe sie, erstelle mit
assignSpalten in einer Methodenkette und sage voraus, wie sich fehlende Werte und die Ausrichtung anhand von Indexbezeichnungen auf das Ergebnis auswirken. - Werte mit np.where, map und apply umkodieren und transformierenWandle Bedingungen mit
np.wherein Bezeichnungen um, ordne Werte mitmapundreplacezu, wende mitapplyeigene Funktionen an und bevorzuge vektorisierte Formen, wo sie existieren.
- Neue Spalten aus vorhandenen Spalten berechnen
- Ordne Zeilen nach einer oder mehreren Spalten, weise Werten mit einer passenden Regel für Rangbindungen Ränge zu, berechne deskriptive Kennwerte für numerische und Textspalten und ermittle Häufigkeiten und Zusammenhänge.
- Zeilen nach Werten oder nach dem Index sortierenSortiere einen DataFrame nach einer oder mehreren Spalten in beide Richtungen, lege die Platzierung fehlender Werte und die Reihenfolge bei Rangbindungen fest und finde die obersten oder untersten Zeilen.
- Werten Ränge zuweisen und Rangbindungen berücksichtigenWeise jedem Wert mit
rankseinen Rang zu, wähle eine zum Zweck passende Methode für Rangbindungen und drücke Ränge als relative Ränge aus. - Spalten mit deskriptiven Kennwerten zusammenfassenBerechne Anzahl, Summe, Lagemaße, Streuung und Quartile mit pandas-Methoden und
describe, interpretiere sie und berücksichtige fehlende Werte und Textspalten richtig. - Werte zählen und Zusammenhänge messenZähle, wie häufig jeder Wert vorkommt, führe unterschiedliche Werte auf, drücke Häufigkeiten als Anteile aus und miss den linearen Zusammenhang zwischen zwei numerischen Spalten mit Korrelation.
- Zeilen nach Werten oder nach dem Index sortieren
Einstieg in pandas einfach erklärt
1Series und DataFrames verstehen
Bezeichnungen machen aus einer Zahlenfolge Daten, die du identifizieren und kombinieren kannst. Erstelle eine Series für eine Variable und einen DataFrame für mehrere Variablen und lies dann ihre Dimensionen und Datentypen aus. Du erfährst, warum die Zuordnung anhand von Bezeichnungen bei der Arithmetik wichtig ist, wie sich eine Spalte von einer Tabelle mit einer Spalte unterscheidet und wie das Auswählen, Zurücksetzen oder Umbenennen eines Index spätere Abfragen verändert. Diese Strukturen bilden die Grundlage für alle folgenden Auswahlen und Berechnungen.
1.1 Eine Series erstellen und ihren Index nutzen
Eine Series hält eine Folge von Werten zusammen mit Bezeichnungen fest. Diese Bezeichnungen geben den Werten Bedeutung: Eine Niederschlagsmessung gehört zu einem Tag und eine Bevölkerungszahl zu einer Stadt. Importiere pandas und NumPy unter ihren üblichen Kurznamen.
import pandas as pd
import numpy as np
rain = pd.Series([4.5, 3.0, 6.2],
index=["Mon", "Tue", "Wed"], name="rain_mm")
Werte und Bezeichnungen auslesen
Die Werte sind 4.5, 3.0 und 6.2; der Index lautet Mon, Tue und Wed. Ohne index= vergibt pandas die Bezeichnungen 0, 1 und 2. Ein Dictionary liefert beides zugleich: pd.Series({"Lima": 10, "Oslo": 5, "Pune": 7}) übernimmt die Bezeichnungen von den Schlüsseln in deren Reihenfolge im Dictionary.
Attribute beschreiben die Series ohne Klammern: rain.index enthält die Bezeichnungen, rain.dtype ist float64, rain.name ist "rain_mm" und rain.size ist 3. Verwende rain.to_numpy(), wenn ein NumPy-Array benötigt wird. Das ältere .values gibt je nach Datentyp unterschiedliche Arten von Arrays zurück; bei Textdaten kann es ein pandas-Array liefern.
Ein Datentyp gibt pandas an, welche Art von Werten gespeichert wird. Häufige Typen sind int64 für ganze Zahlen, float64 für Dezimalzahlen, bool für True/False, str für Text und datetime64 für Datums- und Zeitangaben. pandas 3 ermittelt für Text den Typ str; ältere Beispiele zeigen oft object.
Mit der ganzen Series arbeiten
Für s = pd.Series([10, 20, 30], index=["a", "b", "c"]) erzeugt s * 2 die Werte 20, 40 und 60. s > 15 erzeugt False, True und True. Beide behalten die Bezeichnungen bei. Diese Operationen sind vektorisiert: Ein Ausdruck bearbeitet die ganze Series ohne Python-Schleife.
Schlage eine Bezeichnung mit s["b"] nach; das ergibt 20. Schlage eine Position mit s.iloc[0] nach; das ergibt 10. Der Ausdruck "b" in s prüft den Index; 20 in s ist False. Auch eine Ganzzahl in eckigen Klammern ist eine Bezeichnung: Beim Index [2, 0, 1] meint s[0] die Bezeichnung 0 und nicht den ersten Eintrag. Bei Textbezeichnungen löst s[0] in pandas 3 einen KeyError aus.
Bezeichnungen bei der Arithmetik zuordnen
a = pd.Series([1, 2, 3], index=["x", "y", "z"])
b = pd.Series([10, 20, 30], index=["y", "z", "w"])
a + b
Die gemeinsame Bezeichnung y verbindet 2 und 10 zu 12.0; z verbindet 3 und 20 zu 23.0. Die Bezeichnungen w und x kommen nur in einer Eingabe vor und erhalten daher NaN. Das Ergebnis enthält alle vier Bezeichnungen. Eine Addition nach der sichtbaren Zeilenposition würde fälschlich 11, 22 und 33 ergeben.
Verwende a.add(b, fill_value=0), wenn ein fehlender Wert als null zählen soll. Die Ergebnisse sind w 30.0, x 1.0, y 12.0 und z 23.0. Verwandte Methoden sind sub, mul und div.
Fehlende Werte erkennen
Ein fehlender Gleitkomma- oder str-Wert verwendet NaN; ein fehlender Datums- und Zeitwert verwendet NaT; eine fehlende Ganzzahl mit Fehlwertunterstützung verwendet <NA>. pd.Series([1, None, 3]) wird zu float64 und zeigt 1.0, NaN und 3.0 an, weil das gewöhnliche int64 kein NaN aufnehmen kann.
Wichtige Erkenntnisse
- Eine Series verbindet eine Folge von Werten mit einem Index, einem Datentyp und einem optionalen Namen.
- Verwende zum Nachschlagen eine Bezeichnung und für eine Position
iloc; Zugehörigkeitstests prüfen die Bezeichnungen. - Vektorisierte Arithmetik wirkt auf jeden Wert und behält den Index bei.
- Zwei Series werden anhand ihrer Bezeichnungen ausgerichtet; Bezeichnungen ohne Gegenstück erhalten fehlende Ergebnisse, sofern kein Füllwert angegeben wird.
- Fehlwertkennzeichen hängen vom Datentyp ab:
NaN,NaToder<NA>.
1.2 Einen DataFrame erstellen und seinen Aufbau verstehen
Ein DataFrame ist eine zweidimensionale Tabelle. Jede Zeile erfasst eine Beobachtung, etwa eine Bestellung; jede Spalte enthält eine Variable, etwa eine Menge. Spalten können unterschiedliche Datentypen haben, teilen sich aber denselben Zeilenindex.
Eine Tabelle aus Python-Daten erstellen
df = pd.DataFrame({
"product": ["Notebook", "Desk lamp", "Pen set", "Mug"],
"quantity": [3, 1, 2, 4],
"unit_price": [2.50, 18.00, 4.75, 6.00]
})
Jeder Dictionary-Schlüssel wird zu einem Spaltennamen; jede Liste liefert die Werte dieser Spalte. Die Listen müssen gleich lang sein, damit jede Zeile in jeder Spalte einen Platz hat. Hier lauten die Indexbezeichnungen 0 bis 3. Unterschiedlich lange Listen lösen einen ValueError aus.
Eine Liste von Dictionaries liefert dagegen ein Dictionary pro Zeile. pd.DataFrame([{"a": 1, "b": 2}, {"a": 3, "c": 4}]) erstellt die Spalten a, b und c. Das fehlende b in der zweiten Zeile und das fehlende c in der ersten werden zu NaN, sodass diese Spalten float64 verwenden. Auch ein zweidimensionales NumPy-Array kann Werte liefern; columns=[...] benennt dabei die Spalten.
Die Dimensionen der Tabelle auslesen
df.shape ist (4, 3): vier Zeilen und drei Spalten, in dieser Reihenfolge. len(df) ist 4, während df.size gleich 12 ist, weil es Zellen zählt. df.index enthält Zeilenbezeichnungen, df.columns enthält Spaltenbezeichnungen und df.dtypes gibt einen Datentyp pro Spalte aus. Dies sind Attribute: df.shape() versucht, ein Tupel aufzurufen, und löst einen TypeError aus. df.T vertauscht Zeilen und Spalten.
Eine Series oder eine Tabelle erhalten
| Auswahl | Ergebnis |
|---|---|
df["quantity"] | Eine Series |
df[["quantity"]] | Ein DataFrame mit einer Spalte |
df[["product", "unit_price"]] | Ein DataFrame mit zwei Spalten in dieser Reihenfolge |
Die innere Liste fordert eine Sammlung von Spalten an. Ohne sie übergibt df["product", "unit_price"] einen einzelnen Tupelschlüssel, der keinem der gewöhnlichen Spaltennamen entspricht, und löst einen KeyError aus.
Eckige Klammern funktionieren auch, wenn Namen Leerzeichen enthalten oder mit Methoden kollidieren. Die Punktschreibweise wie df.quantity funktioniert nur bei geeigneten Namen. Eine Spalte namens size benötigt df["size"], weil df.size die Zellenanzahl der Tabelle bezeichnet. Erstelle Spalten ebenfalls mit eckigen Klammern: df["total"] = 5 fügt eine Spalte hinzu, df.total = 5 hingegen nicht.
Eine Achse wählen
Für numbers = pd.DataFrame({"a": [1, 2], "b": [3, 4]}) addiert numbers.sum() entlang der Zeilen und ergibt a 3 und b 7. Dies ist axis=0, auch "index" genannt. numbers.sum(axis=1) addiert über jede Zeile hinweg und ergibt 4 und 6; diese Achse heißt auch "columns". Benenne zuerst das benötigte Ergebnis: eine Summe pro Spalte oder eine Summe pro Zeile.
Die Auswahl einer Zeile erzeugt eine Series, deren Bezeichnungen die Spaltennamen sind. Diese Series benötigt einen Datentyp, der jede Zelle der Zeile aufnehmen kann. Eine Zeile mit Ganz- und Gleitkommazahlen wird zu float64; eine Zeile mit Text und Zahlen wird zu object. Die ursprünglichen Spalten behalten ihre jeweiligen Datentypen.
Wichtige Erkenntnisse
- Ein DataFrame hat einen gemeinsamen Zeilenindex und einen Datentyp pro Spalte.
- Gleich lange Listen liefern Spalten; eine Liste von Dictionaries liefert Zeilen.
shapezählt Zeilen und Spalten;sizezählt Zellen.- Ein einzelner Spaltenname gibt eine Series zurück; eine Liste von Namen gibt einen DataFrame zurück.
axis=0reduziert entlang der Zeilen;axis=1reduziert entlang der Spalten.- Verwende eckige Klammern für Spaltennamen, die mit Attributen oder Methoden kollidieren.
1.3 Bezeichnungen festlegen, zurücksetzen, umbenennen und entfernen
Zeilenbezeichnungen können eine Bedeutung tragen, etwa eine Bestellnummer, oder einfach die aktuellen Zeilen bezeichnen. Ein nützlicher Index macht Abfragen und spätere Ergebnisse leichter interpretierbar. Das Ändern von Bezeichnungen gibt eine neue Tabelle zurück; behalte das Ergebnis daher durch eine Zuweisung.
Eine ID in den Index verschieben
orders = pd.DataFrame({
"order_id": [1001, 1002, 1003],
"product": ["Notebook", "Desk lamp", "Pen set"],
"unit_price": [2.50, 18.00, 4.75]
})
orders_by_id = orders.set_index("order_id")
Die ursprüngliche Tabelle hat einen standardmäßigen RangeIndex: 0, 1 und 2. Die neue Tabelle hat die Bezeichnungen 1001, 1002 und 1003. order_id wurde aus den Spalten in den Index verschoben. orders_by_id.loc[1002] identifiziert nun die Zeile mit Desk lamp anhand ihrer ID.
Der Aufruf orders.set_index("order_id") ohne Speichern des Ergebnisses lässt orders unverändert. Eine erneute Zuweisung wie orders = orders.set_index("order_id") behält die neue Struktur. In pandas 3.1 ist inplace= für diese Methoden zum Ändern von Bezeichnungen und für das Sortieren veraltet; verwende eine Zuweisung.
Bezeichnungen zurück in eine Spalte verschieben
orders_by_id.reset_index() stellt order_id als gewöhnliche Spalte wieder her und erstellt einen neuen RangeIndex. Ein unbenannter Index wird zu einer Spalte namens index. So bleibt die alte Zeilenidentität erhalten.
reset_index(drop=True) verwirft die alten Bezeichnungen. Bei einem Index [10, 20, 30] behält das einfache reset_index() diese Zahlen in einer Spalte index; reset_index(drop=True) verwirft sie und verwendet 0, 1 und 2. Entscheide nach dem Filtern oder Sortieren, ob die alten Bezeichnungen nützlich sind, bevor du sie verwirfst. Die Neunummerierung des Index ändert weder die Datenwerte noch macht sie eine Sortierung rückgängig.
Bezeichnungen umbenennen oder entfernen
renamed = orders.rename(columns={"unit_price": "price"})
short = orders.drop(columns=["product"])
remaining = orders.drop(index=[0, 1])
rename ordnet alten Bezeichnungen neue zu und behält nicht aufgeführte Namen bei. Standardmäßig wird ein falsch geschriebener alter Name ignoriert. Untersuche daher .columns, wenn eine Umbenennung nichts bewirkt zu haben scheint. Um jeden Spaltennamen zu ersetzen, weise orders.columns eine vollständige Liste zu; ihre Länge muss der Spaltenanzahl entsprechen.
drop(columns=...) entfernt Spalten; drop(index=...) entfernt Zeilen anhand ihrer Bezeichnung. Eine fehlende Bezeichnung löst einen KeyError aus. Nach dem Sortieren ist die Bezeichnung 0 möglicherweise nicht mehr die erste Zeile: Ihr Entfernen löscht weiterhin die Zeile mit der Bezeichnung 0.
Wähle eine Liste aus, um die Spaltenreihenfolge festzulegen: orders = orders[["order_id", "unit_price", "product"]]. Spalten, die in dieser Liste fehlen, werden aus dem Ergebnis entfernt.
Prüfen, ob eine ID wirklich eine Zeile identifiziert
Indexbezeichnungen können mehrfach vorkommen. Prüfe orders_by_id.index.is_unique, bevor du sie als eindeutige IDs behandelst. Kommt die Bezeichnung 1002 zweimal vor, gibt .loc[1002] beide Zeilen als DataFrame zurück. Bei eindeutigen Bezeichnungen gibt dieselbe Abfrage mit einer einzelnen Bezeichnung eine Series zurück.
Ein aussagekräftiger Index verbessert auch Zusammenfassungen. In einer Wettertabelle mit Tagen als Index gibt weather["temp_c"].idxmax() einen Tag wie "Thu" aus; bei einem Standardindex gibt es eine Zeilennummer aus.
Wichtige Erkenntnisse
set_indexverschiebt eine Spalte in die Zeilenbezeichnungen;reset_indexverschiebt Bezeichnungen zurück in eine Spalte.reset_index(drop=True)verwirft alte Bezeichnungen.- Behalte Änderungen an Bezeichnungen, indem du die zurückgegebene Tabelle zuweist.
renameändert angegebene Bezeichnungen;dropentfernt Zeilen oder Spalten anhand ihrer Bezeichnung.- Ein Index kann Dubletten enthalten; prüfe die Eindeutigkeit, bevor du ihn als ID verwendest.
2Eine CSV-Datei laden und die eingelesenen Daten prüfen
Eine geladene Tabelle muss geprüft werden, bevor ihre Zahlen als Grundlage einer Analyse dienen können. Stimme die CSV-Optionen auf Trennzeichen, Kopfzeile und Wertkonventionen der Datei ab und prüfe dann, ob das Ergebnis die erwarteten Zeilen, Namen und Datentypen enthält. Untersuche fehlende Einträge und wiederholte IDs und wandle bei Bedarf Zahlen- oder Datumstext um. Kleine Entscheidungen beim Import sind wichtig: Eine verlorene führende Null oder ein nicht umgewandeltes Datum kann die Bedeutung späteren Codes verändern.
2.1 Eine CSV-Datei mit read_csv einlesen
Eine CSV-Datei speichert eine Tabelle als Text: Datensätze stehen in Zeilen und ein Trennzeichen trennt die Felder. Die erste Zeile enthält oft Spaltennamen. Um die Datei richtig zu laden, musst du sowohl ihren Aufbau als auch die Bedeutung ihrer Werte erkennen.
Die Bestelltabelle laden
orders = pd.read_csv("orders.csv")
Ein relativer Pfad wird vom aktuellen Arbeitsverzeichnis von Python aus aufgelöst. Ein falscher Speicherort löst einen FileNotFoundError aus. Auch ein absoluter Pfad oder eine URL kann an read_csv übergeben werden.
Die Beispiele verwenden diese Datei. Die letzte Zeile hat ein leeres Mengenfeld.
order_id,date,product,category,quantity,unit_price
1001,2026-03-02,Notebook,Stationery,3,2.50
1002,2026-03-02,Desk lamp,Home,1,18.00
1003,2026-03-03,Pen set,Stationery,2,4.75
1004,2026-03-04,Mug,Home,4,6.00
1005,2026-03-04,Backpack,Bags,1,35.00
1006,2026-03-05,Notebook,Stationery,,2.50
Mit den Standardeinstellungen hat das Ergebnis die Form (6, 6) und die Indexbezeichnungen 0 bis 5. pandas ermittelt die Datentypen: order_id ist int64, unit_price ist float64, und auch quantity wird zu float64, weil das leere Feld zu NaN wird. Die anderen Spalten einschließlich date sind str. Eine wie ein Datum aussehende Zeichenkette bleibt Text, bis sie umgewandelt wird.
Den Aufbau der Datei berücksichtigen
| Merkmal der Datei | Option zum Einlesen |
|---|---|
| Felder durch Semikolons getrennt | sep=";" |
| Dezimalkommas | decimal="," |
| Keine Kopfzeile | header=None, names=["id", "product"] |
| Zwei zusätzliche Zeilen vor der Kopfzeile | skiprows=2 |
| Nur ausgewählte Felder benötigt | usecols=["product", "quantity"] |
| Eine kurze Vorschau | nrows=100 |
Verwende für eine Datei mit den Zeilen a;b, 1,5;2 und 3,0;4 den Aufruf pd.read_csv("file.csv", sep=";", decimal=","). Spalte a enthält dann 1.5 und 3.0. Das Standardtrennzeichen Komma erzeugt eine Spalte namens a;b: ein Hinweis darauf, das Trennzeichen zu prüfen.
index_col="order_id" macht diese Spalte beim Laden zum Zeilenindex. thousands="," liest ein Feld wie "1,200" als 1200 ein; in einer kommagetrennten Datei muss das Feld durch CSV-Anführungszeichen maskiert werden, damit sein internes Komma nicht als weiteres Trennzeichen gilt.
Bei der Typinferenz die Bedeutung erhalten
Codes wie "001" sind Kennungen und keine Mengen. dtype={"id": str} erhält ihre führenden Nullen. Wandelt pandas sie zuerst in 1 um, kann eine Rückumwandlung dieser Zahl in Text nicht wiederherstellen, wie viele Nullen die Datei enthielt.
Leere Felder und gängige Kennzeichen wie NA, N/A, NULL, NaN und None gelten standardmäßig als fehlend. Ergänze ein besonderes Kennzeichen der Datei mit na_values=["-"]. Dies sind Regeln für das Laden. Prüfe daher die Konventionen der Datei, wenn ein Code wie ein Fehlwertkennzeichen aussieht.
Verwende parse_dates=["date"], um die Beispieldaten als Datums- und Zeitwerte einzulesen. In pandas 3 verwenden diese Daten eine Auflösung in Mikrosekunden, datetime64[us]. UTF-8 ist die Standardzeichenkodierung. Ein UnicodeDecodeError ist ein Anlass, die Kodierung der Datei zu prüfen und die passende Option anzugeben, etwa encoding="latin-1".
Wichtige Erkenntnisse
read_csvgibt einen DataFrame zurück und ermittelt die Spaltentypen.- Stimme
sep,decimalund die Kopfzeilenoptionen auf den Dateiaufbau ab. - Erhalte führende Nullen in Kennungen, indem du beim Laden einen Textdatentyp verwendest.
- Leere Felder und gängige Fehlwertkennzeichen werden zu fehlenden Werten;
na_valuesergänzt Kennzeichen. - Datumsangaben müssen umgewandelt werden, entweder beim Laden mit
parse_datesoder später. - Ein relativer Pfad wird vom aktuellen Arbeitsverzeichnis aus aufgelöst.
2.2 Einen neuen DataFrame untersuchen
Ein erfolgreicher Lesevorgang bedeutet, dass pandas die Datei einlesen konnte. Er belegt nicht, dass Spalten, Datentypen und fehlende Werte zu dem passen, was die Tabelle darstellen soll. Untersuche den neuen DataFrame, bevor du damit rechnest.
Sichtbare Zeilen und Dimensionen prüfen
orders.head(3)
orders.tail()
orders.shape
orders.columns.tolist()
head() zeigt standardmäßig fünf Zeilen; head(3) zeigt drei. tail() prüft das Ende, an dem ein Export andere Datensätze enthalten kann. sample(3, random_state=0) liefert eine reproduzierbare Zufallsstichprobe aus drei Zeilen. In einem Notebook wird der letzte Ausdruck einer Zelle automatisch angezeigt; verwende andernorts print.
Die Bestelldatei sollte sechs Zeilen und sechs Spalten enthalten. Eine Vorschau sollte benannte Spalten und die erste Bestellung als Daten zeigen. Erscheint der erste Datensatz unter den Spaltennamen, fehlt der Datei wahrscheinlich eine Kopfzeile und sie benötigt header=None. Steht alles in einer einzigen breiten Spalte, prüfe sep.
Spaltennamen müssen genau übereinstimmen, einschließlich Groß- und Kleinschreibung und Leerzeichen. orders["Product"] schlägt fehl, wenn der Name product lautet. Durch die Untersuchung der Liste lassen sich angehängte Leerzeichen leichter erkennen. orders.columns = orders.columns.str.strip() entfernt Leerzeichen an den Enden der Kopfzeilennamen.
Den Aufbau mit info auslesen
orders.info() gibt den Indexbereich, den Namen jeder Spalte, die Anzahl vorhandener Werte, den Datentyp und den Speicherbedarf aus. Im Beispiel mit sechs Zeilen hat quantity fünf nicht fehlende Werte; die anderen Spalten haben jeweils sechs. Die Datentypen umfassen zwei Gleitkommaspalten, eine Ganzzahlspalte und drei str-Spalten. orders.dtypes liefert eine kompakte Typenliste.
Eine numerisch aussehende Spalte mit dem Datentyp str solltest du untersuchen: Ein Eintrag wie "unknown", eine Einheit wie "12 kg" oder ein nicht berücksichtigtes Tausendertrennzeichen kann die Erkennung als numerischer Typ verhindern. Auch Datumsangaben bleiben Text, sofern sie nicht umgewandelt werden. Entscheide anhand der Bedeutung der Spalte über den benötigten Typ, nicht allein anhand ihres Aussehens in einer Vorschau.
Lücken und wiederholte Werte zählen
orders.isna().sum()
orders.isna().any(axis=1).sum()
orders.nunique()
isna() erstellt eine boolesche Tabelle: True markiert eine fehlende Zelle. Die Summe entlang jeder Spalte zählt diese Zellen. Quantity hat einen fehlenden Wert und jede andere Spalte null. Um betroffene Zeilen zu zählen, prüft .any(axis=1) zunächst, ob jede Zeile irgendeine Lücke hat; anschließend zählt .sum() diese Zeilen. Würdest du stattdessen alle Spaltenanzahlen addieren, könnte eine Zeile mehrfach gezählt werden.
nunique() zählt unterschiedliche vorhandene Werte: Die Bestellungen haben sechs IDs, vier Daten, fünf Produkte, drei Kategorien, vier Mengen und fünf Preise. Vergleiche die Anzahl der IDs mit der Zeilenanzahl, um die Eindeutigkeit zu prüfen, und berücksichtige dabei auch die Anzahl fehlender IDs. orders.duplicated(subset="product") markiert die zweite Notebook-Zeile mit der Bezeichnung 5 als Wiederholung. Ein wiederholtes Produkt ist hier zulässig; eine wiederholte Bestell-ID müsste untersucht werden.
Einen schnellen numerischen Überblick auslesen
orders.describe() gibt Anzahl, arithmetisches Mittel, Standardabweichung, Minimum, Quartile und Maximum für numerische Spalten aus. Die Anzahl von quantity ist fünf, sodass ihr arithmetisches Mittel fünf erfasste Mengen zusammenfasst. Prüfe neben den Datentypen auch plausible Wertebereiche und Einheiten: Eine Spalte kann numerisch sein und dennoch einen Eingabefehler enthalten. Halte bei der Prüfung neu geladener Daten die festgestellte Zeilenanzahl, Spaltenanzahl, die Datentypen, die Anzahlen fehlender Werte und die ID-Prüfung zusammen fest.
Wichtige Erkenntnisse
- Nutze nach dem Laden Vorschauen, Dimensionen, genaue Spaltennamen und Datentypen gemeinsam.
info()gibt die Anzahl nicht fehlender Werte und die Datentypen aus; es gibt keine Zusammenfassungstabelle zurück.isna().sum()zählt fehlende Zellen pro Spalte;.any(axis=1).sum()zählt betroffene Zeilen.- Prüfe sowohl fehlende IDs als auch die Anzahl unterschiedlicher IDs.
- Die Anzahlen von
describe()zeigen, auf wie vielen erfassten Werten eine numerische Zusammenfassung beruht.
2.3 Spalten in die passenden Datentypen umwandeln
Der Datentyp einer Spalte bestimmt, welche Operationen sinnvoll sind. Eine Textspalte mit "12" speichert weiterhin Text; ihr arithmetisches Mittel lässt sich nicht wie bei einer numerischen Spalte berechnen. Wandle bewusst um und weise das Ergebnis der Tabelle wieder zu.
Strikte Umwandlung oder Typumwandlung mit Fehlerersetzung wählen
astype wandelt eine Series in einen angegebenen Typ um, etwa int, float, str oder "Int64". Die Umwandlung schlägt fehl, wenn ein Wert im gewünschten Typ nicht dargestellt werden kann.
raw = pd.Series(["12", "7", "n/a", "3.5"])
numeric = pd.to_numeric(raw, errors="coerce")
raw.astype(float) löst bei "n/a" einen ValueError aus. Mit errors="coerce" lauten die Ausgabewerte 12.0, 7.0, NaN und 3.5. Der nicht umwandelbare Eintrag wird zu einem fehlenden Wert, statt die Umwandlung zu stoppen. Vergleiche raw.isna().sum() mit numeric.isna().sum(): Aus null fehlenden Werten wurde einer, womit ein zu prüfender Wert sichtbar wird.
Die Fehlerersetzung ist eine Umwandlungsregel und kein Beleg dafür, dass jede neue Lücke harmlos ist. Nutze die Anzahlen vor und nach der Umwandlung, um Verluste zu finden. Speichere die Umwandlung in einer neuen Variablen oder Spalte, wenn der Rohtext nützlich ist, um einen nicht umgewandelten Wert zurückzuverfolgen.
Fehlende ganze Zahlen erhalten
Die Bestellspalte quantity enthält ganze Zahlen und ein NaN, daher ist sie float64. Das einfache astype(int) schlägt fehl, weil NaN keine gewöhnliche Ganzzahldarstellung hat.
orders["quantity"] = orders["quantity"].astype("Int64")
Das große I ist entscheidend: Int64 mit Fehlwertunterstützung behält die Lücke als <NA>, während es die bekannten Werte als ganze Zahlen speichert. Diese Wahl passt zu Anzahlen mit fehlenden Einträgen. Sie macht eine tatsächlich gebrochene Mengenangabe nicht zu einer gültigen ganzzahligen Anzahl.
Auch Tausendertrennzeichen in Text müssen behandelt werden. pd.Series(["1,200", "950"]).str.replace(",", "").astype(int) ergibt 1200 und 950. Verwendet die Datei selbst diese Konvention, kann thousands="," sie beim Einlesen berücksichtigen.
Datumstext umwandeln
orders["date"] = pd.to_datetime(orders["date"])
orders["date"].dt.day_name()
Die Umwandlung ermöglicht .dt.year, .dt.month, .dt.day und .dt.day_name(). Für die sechs Bestelldaten lauten die Tagesnamen Monday, Monday, Tuesday, Wednesday, Wednesday und Thursday. Der alleinige Aufruf von pd.to_datetime(orders["date"]) erzeugt eine umgewandelte Series, lässt die ursprüngliche Spalte aber als Text bestehen. Erst die Zuweisung behält das Ergebnis.
Wiederholte Kategorien speichern
orders["category"].astype("category") speichert wiederholte Bezeichnungen über eine Menge erlaubter Kategorien. Bei großen Tabellen spart dies meist Speicher. Weise das Ergebnis zu, um es zu behalten, genau wie bei anderen Umwandlungen.
Der kategoriale Datentyp verändert einige Operationen. Seine Kategorien sind standardmäßig ungeordnet, daher lösen min() und max() einen TypeError aus. value_counts() einer kategorialen Spalte führt auch bekannte Kategorien auf, die in einer gefilterten Auswahl fehlen, und gibt für sie die Anzahl null an. Der kategoriale Datentyp ist für wiederholte Bezeichnungen nützlich, verändert aber neben der Speicherung auch das Verhalten.
Wichtige Erkenntnisse
astypeschlägt bei ungültigen Umwandlungen fehl;to_numeric(errors="coerce")wandelt ungültige Einträge in fehlende Werte um.- Vergleiche die Anzahl fehlender Werte vor und nach der Typumwandlung mit Fehlerersetzung.
Int64mit Fehlwertunterstützung speichert ganze Zahlen zusammen mit fehlenden Einträgen.- Wandle Datumsangaben mit
to_datetimeum und lies ihre Bestandteile über.dtaus. - Behalte Umwandlungen, indem du ihre Ergebnisse zuweist.
- Der ungeordnete kategoriale Datentyp speichert wiederholte Bezeichnungen effizient, verändert aber einige Zusammenfassungen.
3Daten nach Bezeichnung und nach Position auswählen
Eine Zeile lässt sich anhand ihrer Bezeichnung identifizieren oder anhand ihrer aktuellen Position finden. Lerne, diese Wahl mit loc und iloc ausdrücklich zu treffen, gleichzeitig die benötigten Spalten auszuwählen und vorherzusagen, ob eine Auswahl einen Wert, eine Series oder einen DataFrame zurückgibt. Endpunkte von Slices und erhaltene Bezeichnungen erklären viele Fehler, bei denen das Ergebnis um eins abweicht. Die Unterscheidung ist besonders nützlich, nachdem eine Tabelle sortiert oder gefiltert wurde.
3.1 Zeilen und Spalten mit loc nach ihren Bezeichnungen auswählen
Mit Bezeichnungen kannst du eine Zeile oder Spalte anhand ihrer Bedeutung auswählen. Bei loc identifiziert eine Bestellnummer eine Zeile auch dann, wenn die Tabelle sortiert wurde. Die Auswahl besteht aus einem Zeilenteil, gefolgt von einem Spaltenteil: df.loc[rows, columns].
Von einem aussagekräftigen Index ausgehen
Die Bestelldatei hat sechs Zeilen mit den IDs 1001 bis 1006. Erstelle orders_by_id = orders.set_index("order_id"). Die Spalten lauten der Reihe nach date, product, category, quantity und unit_price. Die Zeilenbezeichnungen sind Bestellnummern, nicht die Positionen 0 bis 5.
orders_by_id.loc[1003]
orders_by_id.loc[1004, "product"]
Der erste Ausdruck gibt Bestellung 1003 als Series zurück: date "2026-03-03", product "Pen set", category "Stationery", quantity 2.0 und Preis 4.75. Die Series trägt den Namen 1003. Der zweite Ausdruck gibt eine Zelle zurück: "Mug".
Eine fehlende Bezeichnung löst einen KeyError aus. orders_by_id.loc[0] schlägt fehl: Eine erste Zeile an Position 0 erzeugt keine Bezeichnung 0.
Mehrere Bezeichnungen auswählen
orders_by_id.loc[[1001, 1005], ["product", "unit_price"]]
Listen wählen Bezeichnungen in der angeforderten Reihenfolge aus. Dies ergibt zwei Zeilen und zwei Spalten: Notebook zu 2.5, dann Backpack zu 35.0. Eine Liste erhält ein tabellenförmiges Ergebnis, auch wenn sie nur eine Bezeichnung enthält: .loc[[1003]] ist ein DataFrame mit einer Zeile.
| Anforderung | Form |
|---|---|
| Ein Wert | .loc[1004, "product"] |
| Eine vollständige Zeile | .loc[1004] |
| Eine Tabelle mit einer Zeile | .loc[[1004]] |
| Alle Zeilen, eine Spalte | .loc[:, "unit_price"] |
Ein Doppelpunkt allein bedeutet alle Bezeichnungen entlang dieser Achse. Lässt du die Spaltenauswahl weg, werden ebenfalls alle Spalten angefordert.
Beide Endpunkte eines bezeichnungsbasierten Slice einschließen
orders_by_id.loc[1002:1004, "product":"quantity"]
Bei diesem geordneten Index sind die Zeilen 1002, 1003 und 1004. Der Spalten-Slice schließt product, category und quantity ein. Sowohl die Endbezeichnung der Zeilen als auch die der Spalten ist enthalten, sodass die Form (3, 3) ist. Würdest du hier Pythons übliche Regel anwenden, nach der der Endpunkt ausgeschlossen ist, würdest du eine vorgesehene Zeile und Spalte auslassen.
Bezeichnungen bleiben beim Sortieren erhalten
Ein Standardindex kann den Unterschied zwischen Bezeichnung und Position verbergen. Angenommen, das Sortieren von Punktzahlen ergibt die Zeilenbezeichnungen 3, 0, 2, 1, 4. .loc[0] wählt weiterhin die Bezeichnung 0 aus, nun die zweite angezeigte Zeile. .iloc[0] wählt die oberste angezeigte Zeile mit der Bezeichnung 3. Beim Sortieren wird eine Zeile zusammen mit ihrer Bezeichnung verschoben; der Index wird nicht stillschweigend neu nummeriert.
Eine Bedingung mit der Spaltenauswahl verbinden
Die Zeilenauswahl kann eine boolesche Series sein:
orders.loc[orders["unit_price"] > 5, ["product", "unit_price"]]
Dies behält Desk lamp zu 18.0, Mug zu 6.0 und Backpack zu 35.0 und gibt nur die beiden angeforderten Spalten zurück. Die Maske bestimmt, welche Zeilen die Bedingung erfüllen; die Spaltenliste bestimmt, was angezeigt wird. Dieselbe Form mit zwei Achsen kann Zellen für eine Aktualisierung auswählen, indem die Auswahl auf der linken Seite einer Zuweisung steht.
Wichtige Erkenntnisse
locwählt Zeilenbezeichnungen und Spaltennamen aus.- Listen fordern Bezeichnungen in ihrer aufgeführten Reihenfolge an und erhalten auf dieser Achse einen DataFrame.
- Bezeichnungsbasierte Slices schließen die Endbezeichnung ein; ein Doppelpunkt wählt alle Bezeichnungen aus.
- Fehlende angeforderte Bezeichnungen lösen einen
KeyErroraus. - Beim Sortieren werden Bezeichnungen mit ihren Zeilen verschoben, sodass sich Bezeichnung 0 und Position 0 unterscheiden können.
- Eine boolesche Zeilenmaske und Spaltennamen können in einem einzigen
loc-Aufruf stehen.
3.2 Mit iloc nach Position auswählen und den passenden Indexer wählen
Verwende iloc, wenn es darauf ankommt, an welcher Stelle eine Zeile oder Spalte steht: die ersten drei Zeilen, die letzte Spalte oder eine bestimmte angezeigte Zelle. Die Auswahl erfolgt über ganzzahlige Positionen, unabhängig von den Indexbezeichnungen.
Bei null anfangen zu zählen
orders.iloc[0] wählt die erste Zeile und orders.iloc[-1] die letzte aus. Eine negative Position zählt vom Ende rückwärts. Zwei Positionen wählen eine Zelle aus: orders.iloc[2, 2] ist "Pen set" in der ursprünglichen Bestelltabelle, in der product an Spaltenposition 2 steht.
Die Tabelle orders_by_id mit geändertem Index hat die Spalten date, product, category, quantity und unit_price. Durch das Verschieben von order_id in den Index haben sich die Spaltenpositionen geändert, sodass product nun an Position 1 steht. Positionsbasierter Code hängt von diesem Aufbau ab.
Vor dem Endpunkt eines Slice aufhören
orders_by_id.iloc[1:3, 0:2]
Ausgewählt werden die Zeilenpositionen 1 und 2 mit den Bestellungen 1002 und 1003. Die Spaltenpositionen sind 0 und 1, also date und product. Position 3 und Spalte 2 sind ausgeschlossen; die Form ist damit (2, 2). Eine ausgelassene Anfangsposition steht für den Beginn des Bereichs, eine ausgelassene Endposition für sein Ende.
Listen fordern bestimmte Positionen an, auch eine Mischung aus positiven und negativen. orders.iloc[[0, -1], [2, 5]] wählt product und unit_price für die erste und letzte Bestellung aus. Beide sind zufällig Notebook zu 2.5.
Die Form des Ergebnisses vorhersagen
| Auswahl | Ergebnis |
|---|---|
orders.iloc[0, 2] | Ein Wert |
orders.iloc[0] | Eine Series für eine Zeile |
orders.iloc[:, 2] | Eine Series für eine Spalte |
orders.iloc[[0]] | Ein DataFrame mit einer Zeile |
orders.iloc[0:1, 2:3] | Ein DataFrame mit einer Zeile und einer Spalte |
Ein Skalar wählt ein Element entlang einer Achse aus und entfernt diese Dimension. Ein Slice oder eine Liste erhält die Achse, auch wenn nur ein Element ausgewählt wird. Das ist wichtig, wenn die nächste Operation eine Tabelle statt einer Series erwartet.
Das Ende einer Tabelle berücksichtigen
Die Bestelltabelle mit sechs Zeilen hat die gültigen nicht negativen Zeilenpositionen 0 bis 5. orders.iloc[10] löst einen IndexError aus. Ein Slice kann über die Tabelle hinausreichen: orders.iloc[4:100] gibt einfach die letzten zwei Zeilen zurück. Eine einzelne nicht vorhandene Position ist eine ungültige Anforderung eines Elements, während ein Slice einen Bereich beschreibt, der auf die verfügbaren Zeilen begrenzt wird.
Bewusst zwischen Bezeichnungen und Positionen wählen
Für eine einzelne Zelle verwendet at Bezeichnungen und iat Positionen. orders.at[2, "product"] und orders.iat[2, 2] ergeben beide "Pen set", bevor die Zeilen neu angeordnet werden.
Wähle loc, wenn du eine ID oder die Bedeutung einer Spalte kennst. Wähle iloc, wenn die Position selbst wichtig ist. Um die ersten Zeilen mit einem Spaltennamen zu kombinieren, gibt orders.columns.get_loc("quantity") dessen Position 4 zurück, sodass du orders.iloc[0:3, 4] verwenden kannst.
Einfache eckige Klammern können ihre Rolle wechseln: orders["product"] wählt eine Spalte aus, aber orders[2:4] wählt die Zeilenpositionen 2 und 3 als Slice aus. Mit ausdrücklich angegebenem loc und iloc ist diese Wahl leichter zu erkennen.
Wichtige Erkenntnisse
ilocverwendet ganzzahlige Positionen ab null; negative Positionen zählen vom Ende.- Positionsbasierte Slices schließen ihren Endpunkt aus und können über die verfügbaren Zeilen hinausreichen.
- Eine einzelne Position außerhalb des gültigen Bereichs löst einen
IndexErroraus. - Skalare Auswahlen entfernen eine Dimension; Listen und Slices erhalten sie.
atwählt eine Zelle nach Bezeichnung undiateine Zelle nach Position aus.
4Zeilen nach Bedingungen filtern
Mit Bedingungen kannst du dich auf Beobachtungen konzentrieren, die eine Frage beantworten. Erstelle Masken aus Vergleichen, verknüpfe sie und verwende Hilfsmethoden für Kategorien, Wertebereiche, Lücken und Textübereinstimmungen. Aktualisiere anschließend die ursprüngliche Tabelle mit einer einzigen loc-Zuweisung. Filtern und Aktualisieren verwenden beide eine Zeilenbedingung, aber unter Copy-on-Write von pandas 3 ist es entscheidend, im Blick zu behalten, welche Tabelle geändert wird.
4.1 Mit booleschen Masken filtern
Beim Filtern wählst du Beobachtungen aus, die eine Frage beantworten, etwa welche Bestellungen zu Home gehören und pro Artikel mehr als 10 kosten. Erstelle zuerst eine boolesche Maske, eine Series mit einem True oder False pro Zeile. Verwende sie dann, um die passenden Zeilen auszuwählen.
Eine Maske erstellen und anwenden
is_stationery = orders["category"] == "Stationery"
stationery = orders[is_stationery]
Die Maske lautet True, False, True, False, False und True. Die Auswahl behält die Bezeichnungen 0, 2 und 5, die den Bestellungen 1001, 1003 und 1006 entsprechen. Das Filtern erhält diese Bezeichnungen und nummeriert sie nicht neu. reset_index(drop=True) erzeugt bei Bedarf fortlaufende Bezeichnungen.
Zu den Vergleichsoperatoren gehören ==, !=, <, <=, > und >=. Textvergleiche müssen genau übereinstimmen: "home" unterscheidet sich von "Home", und auch Leerzeichen können eine Übereinstimmung verhindern.
Bedingungen zeilenweise verknüpfen
is_home = orders["category"] == "Home"
is_expensive = orders["unit_price"] > 10
orders[is_home & is_expensive]
Nur die Desk lamp erfüllt die Bedingung: Ihre Kategorie ist Home und ihr Preis beträgt 18.0. Der Mug gehört zu Home, kostet aber 6.0. Backpack kostet 35.0, gehört aber zu Bags.
Wenn du Vergleiche direkt schreibst, setze jeden in Klammern:
orders[(orders["category"] == "Home") &
(orders["unit_price"] > 10)]
Verwende & für und, | für oder und ~ für nicht. Die Klammern halten jeden Vergleich zusammen, bevor pandas die Masken verknüpft. Ohne sie kann Python aufgrund seiner Vorrangregeln versuchen, eine Zeichenkette und eine Series mit & zu verknüpfen, und einen TypeError auslösen.
Pythons and, or und not erwarten einen einzelnen Wahrheitswert und keine Spalte von Wahrheitswerten. Ihre Verwendung auf Masken löst einen ValueError wegen eines mehrdeutigen Wahrheitswerts aus. Ein einfaches if orders["quantity"] > 1: hat dasselbe Problem. Verwende .any(), um zu fragen, ob irgendeine Zeile zutrifft, oder .all(), um zu fragen, ob jede Zeile zutrifft.
Treffer und Anteile zählen
is_stationery.sum() ist 3, weil True als 1 und False als 0 zählt. is_stationery.mean() ist 0.5, der Anteil der sechs Bestellungen, die zutreffen. Multipliziere mit 100, um diesen Anteil als 50 % auszudrücken.
Fehlende Werte ausdrücklich behandeln
Bei der ursprünglichen float64-Spalte quantity ergeben Vergleiche mit NaN False, außer !=, das True ergibt. quantity >= 1 behält fünf Zeilen; quantity < 1 behält keine. Die leere Mengenangabe ist in keiner der beiden Auswahlen enthalten. Dennoch schließt quantity != 3 diese Zeile mit leerem Wert ein. Ungleich bedeutet also nicht bekannt und verschieden.
Nach der Umwandlung in Int64 mit Fehlwertunterstützung ergibt ein Vergleich mit <NA> den Wert <NA>, und beim Filtern werden diese Zeilen ausgelassen. Verwende isna() oder notna(), wenn es um Lücken geht.
Um neben Zeilen auch Spalten auszuwählen, verwende orders.loc[is_home, "product"]. Der Aufruf gibt Desk lamp und Mug zurück. Eine benannte Maske kann wiederverwendet werden, um dieselben Zeilen zu untersuchen, zu zählen und zu aktualisieren.
Wichtige Erkenntnisse
- Ein Vergleich erzeugt ein boolesches Ergebnis pro Zeile; das Filtern behält Zeilen mit True und erhält ihre Bezeichnungen.
- Verknüpfe Masken mit
&,|und~und setze Vergleiche in Klammern. - Verwende
.any()oder.all(), wenn ein einzelner Wahrheitswert benötigt wird. - Die Summe einer booleschen Maske zählt Treffer und ihr arithmetisches Mittel gibt deren Anteil an.
- Prüfe Lücken ausdrücklich: NaN bei Gleitkommazahlen und
<NA>bei Datentypen mit Fehlwertunterstützung verhalten sich bei Vergleichen unterschiedlich. - Bei Textvergleichen auf Gleichheit zählen Groß- und Kleinschreibung sowie Leerzeichen.
4.2 Hilfsmethoden und query für häufige Filteraufgaben nutzen
Manche Filter haben vertraute Formen: Zugehörigkeit zu einer Liste, ein numerisches Intervall, ein fehlender Wert oder ein Textfragment. Hilfsmethoden drücken diese Tests direkt aus und erzeugen weiterhin Masken, die sich mit anderen Bedingungen verknüpfen lassen.
Zugehörigkeit und Wertebereiche prüfen
orders[orders["category"].isin(["Home", "Bags"])]
orders[orders["unit_price"].between(4.75, 18)]
isin trifft auf jeden aufgeführten Wert zu. Die erste Auswahl enthält die Bestellungen 1002, 1004 und 1005. ~orders["category"].isin(["Home"]) kehrt die Zugehörigkeit um und behält Zeilen mit Stationery und Bags. Ein Python-Ausdruck mit in erzeugt diese zeilenweise Zugehörigkeitsmaske nicht.
between schließt standardmäßig beide Endpunkte ein. Die zweite Auswahl enthält Desk lamp zu 18.0, Pen set zu 4.75 und Mug zu 6.0. Verwende inclusive="neither", um beide Endpunkte auszuschließen, "left", um nur den unteren Endpunkt einzuschließen, oder "right", um nur den oberen Endpunkt einzuschließen. Wähle die Regel für die Endpunkte passend zur gestellten Frage.
Fehlende und vorhandene Einträge finden
orders[orders["quantity"].isna()] behält Bestellung 1006. notna() bewirkt das Gegenteil und behält erfasste Mengen. Prüfe nicht auf Gleichheit mit np.nan: NaN ist selbst zu sich selbst ungleich, sodass quantity == np.nan die Zeile mit fehlendem Wert nicht findet.
Innerhalb von Text suchen
orders[orders["product"].str.contains("note", case=False, na=False)]
str.contains prüft, ob jeder Textwert eine Übereinstimmung enthält. Ohne Berücksichtigung der Groß- und Kleinschreibung werden beide Notebook-Zeilen gefunden. na=False lässt fehlenden Text als Nichtübereinstimmung zählen. Die Suche behandelt ihr Muster standardmäßig als regulären Ausdruck; bei einem wörtlichen Textfragment mit Satzzeichen verhindert regex=False, dass diese Satzzeichen als Muster interpretiert werden. str.startswith und str.endswith prüfen Anfang und Ende.
Einen Filter als Abfrage schreiben
orders.query("quantity >= 2 and unit_price < 5")
Dies behält die Bestellungen 1001 und 1003. Innerhalb einer query-Zeichenkette stehen Spaltennamen für Spalten und and, or und not sind erlaubt. Die Zeichenkette ist ein pandas-Abfrageausdruck; ihre Syntax entspricht nicht der direkten Verknüpfung von Series in gewöhnlichem Python.
Eine Python-Variable benötigt @:
limit = 5
orders.query("unit_price > @limit")
Das Ergebnis enthält Desk lamp, Mug und Backpack. Ein Spaltenname mit Leerzeichen benötigt innerhalb der Abfrage Graviszeichen, wie in orders.query("`unit price` > 5").
Dieselbe Frage lässt sich als Maske, Hilfsmethodenaufruf oder Abfrage schreiben. Bevorzuge die Form, die die Regel klar erkennen lässt. Für ein Intervall stellt between die Schranken und die Regel für ihren Einschluss zusammen dar. Für eine Menge erlaubter Bezeichnungen vermeidet isin wiederholte Gleichheitstests. Verhält sich ein Filter unerwartet, untersuche die Maske und die genauen Spaltenwerte, bevor du die Bedingung änderst.
Wichtige Erkenntnisse
isinprüft die Zugehörigkeit und~kehrt die Maske um.betweenschließt beide Endpunkte ein, soferninclusivedie Regel nicht ändert.isnaundnotnaerkennen Lücken und erfasste Werte.str.containsdurchsucht Text;case=Falseignoriert Groß- und Kleinschreibung undna=Falseschließt fehlenden Text aus.- In
querywerden Spalten direkt benannt, Python-Variablen verwenden@und Spaltennamen mit Leerzeichen Graviszeichen.
4.3 Werte in ausgewählten Zeilen sicher ändern
Eine Aktualisierung muss auf die Tabelle zielen, die du ändern möchtest. In pandas 3 verhält sich eine Auswahl unter Copy-on-Write wie ein separates Objekt. Eine Änderung am ausgewählten Objekt ändert daher seine Ursprungstabelle nicht.
Das gesamte Ziel in eine loc-Zuweisung setzen
sale = orders.copy()
is_home = sale["category"] == "Home"
sale.loc[is_home, "unit_price"] *= 0.9
Die Maske wählt zwei Home-Zeilen aus. Die Spaltenauswahl zielt auf deren Preise. Die Multiplikation mit 0,9 behält 90 % jedes Preises bei und senkt 18,00 auf 16,20 und 6,00 auf 5,40. Andere Zeilen bleiben unverändert. Die ausgeschriebene Form liest rechts dieselbe Auswahl aus und weist links ihre multiplizierten Werte zu.
Hier ist sale eine separate Tabelle für eine Preisänderung, sodass orders für den Vergleich verfügbar bleibt. Um die ursprüngliche Tabelle zu aktualisieren, setze orders.loc[...] selbst auf die linke Seite der Zuweisung.
Verkettete Zuweisung vermeiden
orders[orders["category"] == "Home"]["unit_price"] = 0
Dies verwendet zwei Indizierungsschritte. Der erste erzeugt ein ausgewähltes Objekt; der zweite weist diesem Objekt einen Wert zu. In pandas 3 aktualisiert dies niemals orders, und eine ChainedAssignmentError-Warnung weist auf das Problem hin. Dasselbe Problem betrifft orders["unit_price"][1] = 0.
Verwende orders.loc[orders["category"] == "Home", "unit_price"] = 0, wenn die ursprüngliche Tabelle geändert werden soll. Tabelle, passende Zeilen und Spalte werden alle in einer Zuweisung angegeben.
Ausgewählte Tabellen verstehen
Nach home = orders[orders["category"] == "Home"] ändert eine Änderung an home["unit_price"] nur home. Spätere Änderungen an orders ändern ebenfalls nicht home. Die Objekte können sich intern Speicher teilen, bis ein Schreibvorgang nötig wird, aber ihre sichtbaren Werte verhalten sich unabhängig voneinander.
Ältere pandas-Beispiele zeigen möglicherweise eine SettingWithCopyWarning und verwenden nach einer Auswahl .copy(), um unsichere Aktualisierungen zu vermeiden. pandas 3 hat diese Warnung entfernt und sorgt einheitlich dafür, dass sich Auswahlen unabhängig verhalten. Ein ausdrückliches .copy() ist weiterhin nützlich, um die Absicht deutlich zu machen, aber eine Auswahl verhält sich bei Aktualisierungen bereits unabhängig.
Werte auf der rechten Seite dem Ziel zuordnen
Ein Skalar füllt alle ausgewählten Zellen. Eine Liste benötigt genau einen Wert pro ausgewählter Zeile und füllt sie in der Reihenfolge der Auswahl. Eine Series wird anhand der Indexbezeichnung ausgerichtet:
new_prices = pd.Series([16.2, 5.4], index=[1, 3])
sale.loc[is_home, "unit_price"] = new_prices
Die Home-Zeilen haben die Bezeichnungen 1 und 3 und erhalten daher 16.2 und 5.4. Würde eine ausgewählte Bezeichnung in der Series fehlen, wäre der zugewiesene Wert NaN; Zeilen außerhalb der Auswahl blieben unverändert. Gleiche Längen allein stellen keine Zuordnung der Series zu den Zeilen sicher.
Untersuche sale.loc[is_home, "unit_price"] nach der Änderung und vergleiche es mit orders.loc[is_home, "unit_price"]. Das .sum() der Maske ist 2 und gibt damit die erwartete Anzahl der für diesen Rabatt ausgewählten Zeilen an.
Wichtige Erkenntnisse
- Aktualisiere die gewünschte Tabelle mit einer einzigen
loc[mask, column]-Zuweisung. - In pandas 3 aktualisiert eine verkettete Zuweisung niemals die ursprüngliche Tabelle.
- Auswahlen verhalten sich unter Copy-on-Write unabhängig.
- Ein Skalar füllt die Auswahl; eine Liste folgt der Reihenfolge; eine Series wird nach Bezeichnung ausgerichtet.
5Spalten hinzufügen und transformieren
Berechnete Spalten drücken Zusammenhänge aus, die bereits in einer Tabelle vorhanden sind: Aus Menge und Preis wird Umsatz, während eine Bedingung zu einer Kategoriebezeichnung wird. Verwende vektorisierte Arithmetik und kleine Transformationen, um diese Regeln klar zu formulieren. Du wählst außerdem zwischen der Zuordnung jedes Werts und dem Ersetzen einzelner Werte, behältst Ergebnisse durch Zuweisung und berücksichtigst fehlende Eingaben und die Ausrichtung anhand von Bezeichnungen, wenn neue Werte in eine Tabelle gelangen.
5.1 Neue Spalten aus vorhandenen Spalten berechnen
Neue Spalten machen aus erfassten Daten Größen, die du analysieren kannst. Eine Berechnung zwischen Spalten erfolgt zeilenweise, während der Index jedes Ergebnis seiner Beobachtung zugeordnet hält.
Umsatz berechnen
orders["revenue"] = orders["quantity"] * orders["unit_price"]
Die sechs Umsätze sind 7.5, 18.0, 9.5, 24.0, 35.0 und NaN. In der ersten Zeile ergeben drei Artikel zu je 2,50 den Wert 7,50. Die letzte Zeile hat eine unbekannte Menge, daher ist auch ihr Umsatz unbekannt. Die Zuweisung an einen neuen Namen fügt rechts eine Spalte hinzu; die Zuweisung an einen vorhandenen Namen überschreibt diese Spalte.
Spaltenarithmetik ist vektorisiert. Sie drückt eine Regel für die ganze Spalte aus und vermeidet eine Python-Schleife über Zeilen. Bei großen Tabellen ist dies deutlich schneller als for oder iterrows, und der Ausdruck macht den Zusammenhang zwischen den Eingaben deutlich.
Die erfassten Werte für eine Summe verwenden
orders["revenue"].sum() überspringt NaN und ergibt 94.0, die Summe der fünf bekannten Umsätze. .mean() ergibt 18.8, weil der Nenner fünf erfasste Umsätze umfasst. Würdest du 94.0 durch alle sechs Zeilen dividieren, würdest du den fehlenden Umsatz stillschweigend so behandeln, als hätte er eine bekannte Null beigetragen.
Um prozentuale Anteile zu berechnen:
orders["share_pct"] = (
orders["revenue"] / orders["revenue"].sum() * 100
).round(1)
Die Anteile sind 8.0, 19.1, 10.1, 25.5, 37.2 und NaN. Dies sind Anteile an der bekannten Summe. Der fehlende Eintrag bleibt bei der Arithmetik fehlend.
Mit assign eine Tabelle zurückgeben
assign gibt einen neuen DataFrame mit hinzugefügten oder ersetzten Spalten zurück und lässt seine Eingabe unverändert. Es lässt sich gut in einer Kette verwenden:
with_tax = orders.assign(
tax=lambda d: (d["revenue"] * 0.2).round(2)
)
Der Lambda-Ausdruck liest die Tabelle an dieser Stelle der Kette. Er liefert die Steuerwerte 1.5, 3.6, 1.9, 4.8, 7.0 und NaN. In pandas 3 ist pd.col("revenue") * 0.2 eine weitere Möglichkeit, in assign auf eine Spalte zu verweisen.
Bei Dezimalrechnungen können winzige binäre Gleitkommafehler sichtbar werden: 9,5 mal 0,2 kann als 1.9000000000000001 gespeichert werden. .round(2) liefert einen nützlichen Wert für die Darstellung. Vermeide exakte Gleichheitstests bei berechneten Dezimalzahlen, wenn kleine Darstellungsfehler möglich sind.
Wissen, wie Zuweisungen Zeilen zuordnen
orders["home_price"] = orders.loc[
orders["category"] == "Home", "unit_price"
]
Die zugewiesene Series hat die Bezeichnungen 1 und 3. Diese Zeilen erhalten 18.0 und 6.0; jede andere Zeile erhält NaN. Die Zuweisung einer Series ordnet anhand der Bezeichnungen zu, auch wenn ihre Länge von der der Tabelle abweicht. Eine einfache Liste hat keine Bezeichnungen und muss genau einen Wert pro Zeile enthalten. Ein Skalar wie in orders["currency"] = "EUR" füllt jede Zeile.
Werte aus Text oder Datumsangaben ableiten
Auch die Accessoren .str und .dt bieten vektorisierte Spaltenoperationen. orders["product"].str.upper() liefert Namen in Großbuchstaben und .str.len() die Längen 8, 9, 7, 3, 8 und 8. Weise solche Ergebnisse einer neuen Spalte zu, wenn sowohl die ursprünglichen als auch die abgeleiteten Werte nützlich sind.
Wichtige Erkenntnisse
- Die Zuweisung eines Spaltenausdrucks speichert ein Ergebnis pro Zeile.
- Unbekannte Eingaben ergeben bei der Arithmetik meist unbekannte Ergebnisse; Zusammenfassungen überspringen fehlende Werte standardmäßig.
- Vektorisierte Spaltenoperationen vermeiden Schleifen über Zeilen.
assigngibt einen neuen DataFrame zurück und kann über einen Lambda-Ausdruck auf Spalten zugreifen.- Die Zuweisung einer Series ordnet nach Bezeichnungen zu; die Zuweisung einer Liste folgt Zeilenreihenfolge und -anzahl.
- Verwende
.strund.dtfür Spalten, die aus Text und Datumsangaben abgeleitet werden.
5.2 Werte mit np.where, map und apply umkodieren und transformieren
Eine Spalte zu transformieren kann bedeuten, eine numerische Regel anzuwenden, eine Bezeichnung zuzuweisen oder vorhandene Bezeichnungen zu übersetzen. Wähle eine Methode, deren Verhalten zur Regel passt, besonders für Werte, die die Regel nicht nennt.
Eine Bedingung in Bezeichnungen umwandeln
orders["price_band"] = np.where(
orders["unit_price"] >= 5, "high", "low"
)
np.where wählt sein zweites Argument, wenn die Bedingung True ist, und sein drittes, wenn sie False ist. Für die Preise 2,50; 18,00; 4,75; 6,00; 35,00 und 2,50 lauten die Bezeichnungen low, high, low, high, high und low. Das >= schließt einen Preis ein, der genau 5 beträgt.
Alle Werte zuordnen oder einzelne ändern
codes = {"Stationery": "ST", "Home": "HM", "Bags": "BG"}
orders["category_code"] = orders["category"].map(codes)
map mit einem Dictionary ergibt ST, HM, ST, HM, BG und ST. Ein Wert, der im Dictionary fehlt, wird zu NaN. Steht dort nur {"Stationery": "ST"}, werden sowohl Home als auch Bags zu fehlenden Werten. Verwende eine vollständige Zuordnung, wenn jede Kategorie einen zugeordneten Code benötigt.
replace ändert aufgeführte Werte und lässt nicht aufgeführte unverändert. orders["category"].replace({"Bags": "Luggage"}) behält Stationery und Home bei und benennt Bags um.
| Gewünschte Änderung | Geeignete Methode |
|---|---|
| Jeder bekannten Kategorie einen Code geben | map mit einem Dictionary |
| Einzelne vorhandene Bezeichnungen umbenennen | replace |
| Anhand einer Bedingung zwischen zwei Ausgaben wählen | np.where |
Eine eigene Funktion anwenden
Eine Series kann jeden Wert über map oder apply an eine Funktion übergeben. orders["product"].apply(len) gibt die Länge jedes Produktnamens zurück. Übergib len selbst; len() würde die Funktion sofort ohne Wert aufrufen.
Ein Lambda-Ausdruck kann eine kurze Regel für Werte ausdrücken: orders["unit_price"].apply(lambda p: "budget" if p < 5 else "standard"). Dies gibt budget, standard, budget, standard, standard und budget zurück.
Für Logik, die mehrere Zellen einer Zeile benötigt, akzeptiert apply auf einem DataFrame axis=1:
orders.apply(
lambda r: r["quantity"] * r["unit_price"], axis=1
)
Die Funktion liest Menge und Preis jeder Zeile. Für diese Berechnung ist die direkte Spaltenmultiplikation klarer und bei einer großen Tabelle deutlich schneller. Verwende vektorisierte Ausdrücke oder np.where, wenn sie die Berechnung ausdrücken können; behalte zeilenweise Funktionen für Logik vor, die sie benötigt.
Integrierte numerische Transformationen verwenden
round(n) rundet auf n Nachkommastellen, abs() gibt absolute Werte zurück und clip(lower=..., upper=...) begrenzt Werte an Schranken. orders["unit_price"].clip(upper=20) ändert 35.0 in 20.0 und lässt die anderen fünf Preise unverändert. Die teure Zeile wird nicht entfernt.
Diese Transformationen geben neue Werte zurück. Weise sie einer neuen Spalte zu, um die Eingabe für eine Prüfung zu erhalten, oder überschreibe das Original, wenn dies beabsichtigt ist. Untersuche einige transformierte Zeilen oder führe value_counts() aus, um zu prüfen, ob neue Bezeichnungen und ihre Anzahlen zur Regel passen.
Wichtige Erkenntnisse
np.wherewählt für jeden Bedingungswert eine Ausgabe für den Fall True oder False.mapmit einem Dictionary macht nicht aufgeführte Werte zu fehlenden Werten;replacebehält sie bei.- Übergib
applydie Funktion selbst; verwendeaxis=1für eine Zeilenfunktion auf einem DataFrame. - Bevorzuge vektorisierte Operationen, wenn sie die Regel ausdrücken.
clipbegrenzt Werte, währendroundundabssie transformieren, ohne Zeilen auszuwählen.
6Daten sortieren, Ränge vergeben und Daten zusammenfassen
Eine geordnete Tabelle und eine kompakte statistische Zusammenfassung beantworten unterschiedliche Fragen zu denselben Beobachtungen. Sortiere Datensätze, weise Ränge mit einer bewusst gewählten Regel für Rangbindungen zu und wähle Anzahlen, Lagemaße oder Streuungsmaße, die zu den Daten passen. Untersuche anschließend Kategorieanteile und Zusammenhänge zwischen numerischen Variablen. Fehlende Werte, die Richtung der Rangvergabe, Nenner bei Stichproben und die Grenzen der Korrelation beeinflussen, wie ein Ergebnis zu verstehen ist.
6.1 Zeilen nach Werten oder nach dem Index sortieren
Das Sortieren ändert die Reihenfolge, in der Beobachtungen erscheinen. Es hält die Werte jeder Zeile zusammen und nimmt die Zeilenbezeichnung mit. Entscheide, was Vorrang hat und wie gleiche Werte geordnet werden sollen, bevor du die obersten oder untersten Zeilen auswählst.
Nach einer Spalte sortieren
scores = pd.DataFrame({
"name": ["Ana", "Ben", "Chen", "Dara", "Eli"],
"points": [88, 92, 88, 75, 92]
})
ordered = scores.sort_values("points")
Standardmäßig steht der kleinste Wert zuerst. Die 75 von Dara steht am Anfang, gefolgt von den beiden Werten 88 und dann den beiden Werten 92. Zeilenbezeichnungen bewegen sich mit den Datensätzen. Bei gleichen Werten garantiert der standardmäßige Sortieralgorithmus nicht die ursprüngliche Reihenfolge; die angezeigten Bezeichnungen können 3, 0, 2, 1, 4 lauten, aber du darfst nicht davon ausgehen, dass Zeilen mit gleichen Werten diese Reihenfolge behalten.
Verwende ascending=False, damit der größte Wert zuerst steht. sort_values gibt eine Tabelle zurück und lässt scores unverändert, sofern das Ergebnis nicht zugewiesen wird.
Die Behandlung gleicher Werte festlegen
scores.sort_values(
["points", "name"], ascending=[False, True]
)
Der erste Schlüssel hat Vorrang. Die Punktzahlen nehmen ab; bei gleichen Punktzahlen steigen die Namen auf. Die Reihenfolge lautet Ben, Eli, Ana, Chen und Dara. Eine Sortierung zuerst nach Namen würde eine andere Frage beantworten, weil die Namen dann der primäre Schlüssel wären.
Sollen bei einer Sortierung nach einer Spalte gleiche Werte ihre Eingabereihenfolge behalten, verwende scores.sort_values("points", kind="stable"). Die stabile Sortierung erhält die bisherige Reihenfolge solcher Zeilen. Ein zweiter Schlüssel gibt gleichen Werten dagegen eine eigene ausdrückliche Sortierregel.
Fehlende Werte und Text platzieren
Fehlende Werte stehen standardmäßig sowohl bei aufsteigender als auch bei absteigender Sortierung zuletzt. pd.Series([3.0, np.nan, 1.0]).sort_values() ergibt 1.0, 3.0 und dann NaN. na_position="first" verschiebt den fehlenden Eintrag an den Anfang; das bloße Umkehren der Sortierrichtung bewirkt dies nicht.
Die Textsortierung folgt den Zeichencodes. "Zebra" steht vor "apple", weil Groß- und Kleinbuchstaben unterschiedliche Bereiche belegen. Einheitlich geschriebene Namen wie Bags, Home und Stationery stehen in der erwarteten alphabetischen Reihenfolge.
Bezeichnungen sortieren oder neu nummerieren
sort_index() ordnet die Zeilenbezeichnungen und nicht die Datenwerte. Nach dem Sortieren nach Punkten kann es die ursprüngliche Reihenfolge der Standardbezeichnungen wiederherstellen. sort_index(ascending=False) kehrt die Reihenfolge der Bezeichnungen um. reset_index(drop=True) dagegen behält die aktuelle Zeilenreihenfolge bei und ersetzt ihre Bezeichnungen durch 0, 1, 2 und so weiter.
Die größten oder kleinsten Zeilen auswählen
scores.nlargest(2, "points") gibt Ben und Eli zurück, beide mit 92. nsmallest wählt stattdessen niedrige Werte. Fällt die Auswahlgrenze in eine Rangbindung, entscheide, ob alle Zeilen mit gleichem Wert behalten werden sollen. scores.nlargest(1, "points", keep="all") gibt beide Werte 92 zurück, obwohl n gleich 1 ist. Die angeforderte Anzahl ist dann eine Auswahlgrenze und keine Zusage über die endgültige Zeilenanzahl.
Wichtige Erkenntnisse
sort_valuesordnet Zeilen nach Datenwerten;sort_indexordnet Zeilenbezeichnungen.ascending=Falsesetzt große Werte an den Anfang, während fehlende Werte standardmäßig weiterhin zuletzt stehen.- Mehrere Sortierschlüssel werden nach Priorität angewendet und können unterschiedliche Richtungen verwenden.
- Verwende einen zweiten Schlüssel oder eine stabile Sortierung nach einer Spalte, wenn die Reihenfolge gleicher Werte wichtig ist.
reset_index(drop=True)nummeriert die aktuelle Reihenfolge neu, ohne erneut zu sortieren.keep="all"kann bei der Auswahl größter Werte mehr als n Zeilen zurückgeben.
6.2 Werten Ränge zuweisen und Rangbindungen berücksichtigen
Ein Rang hält fest, wo ein Wert in der sortierten Reihenfolge hingehört, ohne seine Zeile zu verschieben. Das ist nützlich, wenn jede Beobachtung neben ihren ursprünglichen Daten eine Platznummer benötigt. Rangbindungen brauchen eine Regel, weil mehrere Werte denselben Teil dieser Reihenfolge belegen können.
Die Richtung wählen
scores["points"].rank() vergibt Ränge vom kleinsten zum größten Wert. Verwende ascending=False für eine Ergebnistabelle, in der hohe Punktzahlen die besten Ränge erhalten sollen. Die Methode für Rangbindungen entscheidet dann, welche Platznummer jede Gruppe gleicher Werte erhält.
Die Beispielpunktzahlen in Zeilenreihenfolge sind Ana 88, Ben 92, Chen 88, Dara 75 und Eli 92. In absteigender Reihenfolge belegen die Werte 92 die Plätze 1 und 2, die Werte 88 die Plätze 3 und 4 und 75 den Platz 5. Die Standardeinstellung method="average" weist jedem gleichen Wert das arithmetische Mittel der belegten Plätze zu. Die zurückgegebenen Werte in der ursprünglichen Zeilenreihenfolge lauten 3,5; 1,5; 3,5; 5,0 und 1,5.
Eine Methode für Rangbindungen wählen
| Methode | Absteigende Ränge in ursprünglicher Zeilenreihenfolge | Regel für Rangbindungen |
|---|---|---|
average | 3,5; 1,5; 3,5; 5,0; 1,5 | Mittelwert der belegten Ränge |
min | 3, 1, 3, 5, 1 | Kleinster belegter Rang |
max | 4, 2, 4, 5, 2 | Größter belegter Rang |
dense | 2, 1, 2, 3, 1 | Ein Rang pro unterschiedlichem Wert, keine Lücken |
first | 3, 1, 4, 5, 2 | Getrennte Ränge nach Auftretensreihenfolge |
Bei min bedeuten zwei Gewinner auf Rang 1, dass die nächste Punktzahl auf Rang 3 beginnt. Bei dense beginnt die nächste andere Punktzahl auf Rang 2. first löst eine Rangbindung auch dann auf, wenn die Punktzahlen selbst keinen Grund bieten, eine Person zu bevorzugen; es folgt der Eingabereihenfolge.
Rangergebnisse sind Gleitkommazahlen und erlauben damit Werte wie 1,5. Wenn eine gewählte Methode für Rangbindungen ganzzahlige Ränge ergibt und keiner fehlt, wandelt .astype(int) sie für die Darstellung in Ganzzahlen um. Ein gewöhnlicher Ganzzahldatentyp kann keinen fehlenden Rang aufnehmen.
Ränge als Anteile ausdrücken
Bei der standardmäßigen Mittelwertmethode und nicht fehlenden Werten dividiert rank(pct=True) jeden Rang durch die Anzahl der eingestuften Werte. Die aufsteigende Einstufung der fünf Beispielpunktzahlen ergibt 2,5; 4,5; 2,5; 1,0 und 4,5. Die Division durch fünf ergibt 0,5; 0,9; 0,5; 0,2 und 0,9.
Die höchsten Werte mit Rangbindung erhalten 0,9 und nicht 1, weil ihr mittlerer Rang 4,5 ist. Ein relativer Rang beschreibt den Rang im Verhältnis zu den eingestuften Werten; er ist kein Prozentsatz der Punktzahl selbst.
Fehlende Ränge behandeln und Ergebnisse speichern
Fehlende Werte behalten standardmäßig NaN als Rang. Bei den Umsätzen 7,5; 18,0; 9,5; 24,0; 35,0 und NaN lauten die absteigenden Ränge 5, 3, 4, 2, 1 und NaN. na_option="bottom" setzt den fehlenden Eintrag hinter die erfassten Werte und gibt ihm Rang 6.
scores["place"] = scores["points"].rank(
method="min", ascending=False
)
Die Zeilen bleiben Ana, Ben, Chen, Dara und Eli. Die neue Spalte place enthält 3, 1, 3, 5 und 1. Sortiere separat, wenn die Anzeige die Gewinner zuerst zeigen soll.
Wichtige Erkenntnisse
- Die Rangvergabe weist Plätze zu, ohne Zeilen zu verschieben; bei absteigender Rangvergabe erhalten große Werte niedrige Rangzahlen.
- Methoden für Rangbindungen legen fest, ob geteilte Ränge Lücken lassen oder der Eingabereihenfolge folgen.
- Die standardmäßige Mittelwertmethode kann gebrochene Ränge zurückgeben.
- Bei der standardmäßigen Rangvergabe mit Mittelwert dividiert
pct=Truedurch die Anzahl der eingestuften Werte. - Fehlende Werte behalten standardmäßig fehlende Ränge;
na_option="bottom"setzt sie auf den letzten Rang.
6.3 Spalten mit deskriptiven Kennwerten zusammenfassen
Ein deskriptiver Kennwert verdichtet viele Beobachtungen zu einer nützlichen Größe. Wähle einen Kennwert, der zur Frage passt, und lies die Anzahl nicht fehlender Werte ab, damit du weißt, auf wie vielen Daten er beruht.
Lagemaße und Streuung berechnen
weather = pd.DataFrame({
"temp_c": [14.0, 17.5, 16.0, 21.0, 19.5, 12.5, 15.0],
"rain_mm": [0.0, 2.4, 0.0, 0.0, 5.1, 12.3, 0.8]
}, index=["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"])
Für weather["temp_c"] ist sum() gleich 115.5, mean() gleich 16.5 und median() gleich 16.0. Das Minimum ist 12.5 und das Maximum 21.0, was eine Spannweite von 8,5 °C ergibt. idxmax() gibt die Bezeichnung "Thu" zurück, während idxmin() "Sat" zurückgibt: Sie identifizieren Beobachtungen, statt die Extremwerte selbst zurückzugeben.
std() und var() messen die Streuung. pandas verwendet standardmäßig den Nenner für Stichproben, ddof=1, und dividiert die quadrierten Abweichungen durch eine um eins kleinere Anzahl als die Anzahl der Werte. Hier beträgt die Standardabweichung etwa 3,028 °C und die Varianz etwa 9,167 Quadratgrad Celsius. std(ddof=0) verwendet die Anzahl selbst und ergibt etwa 2,803 °C. NumPys np.std verwendet standardmäßig ddof=0; gleiche daher die Einstellung an, bevor du Ergebnisse vergleichst.
Quartile und describe auslesen
quantile(0.25) liefert das untere Quartil 14.5; quantile(0.5) liefert den Median 16.0; quantile(0.75) liefert das obere Quartil 18.5. Die standardmäßige Interpolation kann einen Wert zwischen erfassten Messwerten zurückgeben.
weather.describe() stellt Anzahl, arithmetisches Mittel, Standardabweichung, Minimum, die drei Quartile und Maximum für numerische Spalten zusammen. Der Regen hat ein arithmetisches Mittel von etwa 2,94 mm und einen Median von 0,8 mm. Der Messwert von 12,3 mm zieht das arithmetische Mittel nach oben; der Median beschreibt einen typischen Tag in dieser Woche mit rechtsschief verteiltem Niederschlag besser.
Fehlende Werte und Datentypen berücksichtigen
Für pd.Series([1, np.nan, 3]) ist .mean() gleich 2.0, weil fehlende Werte standardmäßig übersprungen werden. .count() ist 2, während .size gleich 3 ist. Mit skipna=False ist das arithmetische Mittel NaN. Verwende nicht die Zeilenanzahl als Nenner für das standardmäßige arithmetische Mittel, wenn einige Einträge fehlen.
Textzusammenfassungen sind anders. orders["category"].describe() ergibt count 6, unique 3, top Stationery und freq 3. Die Mittelwertberechnung für die Bestelltabelle mit gemischten Daten einschließlich Text löst einen TypeError aus; verwende orders.mean(numeric_only=True) oder wähle mit select_dtypes("number") numerische Spalten aus.
Entlang einer Achse zusammenfassen
Standardmäßig reduzieren DataFrame-Kennwerte entlang der Zeilen auf ein Ergebnis pro Spalte. axis=1 liefert stattdessen ein Ergebnis pro Zeile; wähle Größen aus, deren Einheiten sich sinnvoll kombinieren lassen.
orders[["quantity", "unit_price"]].agg(["mean", "max"])
agg berechnet mehrere benannte Kennwerte gemeinsam. Quantity hat ein arithmetisches Mittel von 2.2 und ein Maximum von 4.0; unit_price hat ein arithmetisches Mittel von etwa 11.46 und ein Maximum von 35.0. weather["rain_mm"].cumsum() ergibt die kumulativen Summen 0.0, 2.4, 2.4, 2.4, 7.5, 19.8 und 20.6 mm und behält ein Ergebnis pro Tag bei.
Wichtige Erkenntnisse
- Wähle Summen, Lagemaße oder Streuungsmaße passend zur Frage.
describestellt gängige numerische Kennwerte zusammen; Textspalten haben Zusammenfassungen auf Basis von Häufigkeiten.countschließt fehlende Werte aus, währendsizesie einschließt.- Die Standardabweichung in pandas verwendet
ddof=1; NumPy verwendet standardmäßigddof=0. - Quantile können zwischen Messwerten interpolieren.
idxmaxundidxmingeben Bezeichnungen zurück;cumsumgibt kumulative Summen zurück.aggfordert mehrere Kennwerte an undaxissteuert die Richtung der Reduktion.
6.4 Werte zählen und Zusammenhänge messen
Häufigkeiten beschreiben, wie oft Werte vorkommen; Korrelationen beschreiben, wie zwei numerische Variablen gemeinsam variieren. Beide Zusammenfassungen müssen interpretiert werden: Was wird gezählt, was fehlt und welchen Zusammenhang misst der Kennwert?
Kategorien zählen oder unterschiedliche Werte aufführen
orders["category"].value_counts() ergibt Stationery 3, Home 2 und Bags 1, nach Häufigkeit geordnet. Die zurückgegebene Series heißt count. Fehlende Einträge werden standardmäßig ausgeschlossen; dropna=False zählt sie separat mit.
orders["category"].value_counts(normalize=True)
Die normierte Series heißt proportion: Stationery ist 0.5, Home etwa 0.333 und Bags etwa 0.167. Die Multiplikation mit 100 ergibt Prozentangaben. Bei der standardmäßigen Regel für fehlende Werte beschreiben diese Anteile die vorhandenen Werte.
| Frage | Methode |
|---|---|
| Wie häufig kommt jeder Wert vor? | value_counts() |
| Welche unterschiedlichen Werte kommen vor? | unique() |
| Wie viele unterschiedliche vorhandene Werte kommen vor? | nunique() |
| Welcher Wert oder welche Werte kommen am häufigsten vor? | mode() |
unique() behält die Reihenfolge des ersten Auftretens bei: Stationery, Home, Bags. mode() gibt eine Series zurück, weil mehrere Werte dieselbe höchste Häufigkeit haben können. Die Methode fordert nicht einen einzelnen willkürlich gewählten Gewinner an.
Bedingungen lassen sich direkt zählen. (weather["rain_mm"] > 0).sum() zählt vier Regentage. Das zugehörige .mean() ist etwa 0.571, sodass es an etwa 57 % der sieben Tage regnete.
Einen geradlinigen Zusammenhang messen
weather["temp_c"].corr(weather["rain_mm"]) ergibt eine Pearson-Korrelation von etwa −0,397. Das negative Vorzeichen besagt, dass in diesen Beobachtungen an wärmeren Tagen tendenziell weniger Regen fiel. Der Betrag beschreibt auf einer Skala von −1 über 0 bis 1, wie gut ein geradliniges Muster passt.
Ein Wert von 1 bedeutet einen perfekten steigenden geradlinigen Zusammenhang; −1 bedeutet einen perfekten fallenden. Ein Wert nahe null bedeutet einen geringen linearen Zusammenhang. Ein gekrümmter Zusammenhang kann dennoch stark sein, selbst wenn die Pearson-Korrelation nahe null liegt. Korrelation beschreibt außerdem einen Zusammenhang und ist kein Beleg dafür, dass die Änderung einer Variablen die Änderung der anderen verursacht.
Eine Korrelationsmatrix auslesen
weather.corr() liefert alle numerischen Paare gemeinsam. Die Matrix ist symmetrisch: Temperatur mit Regen hat dieselbe Korrelation wie Regen mit Temperatur. Eine variierende numerische Spalte hat mit sich selbst die Korrelation 1; eine konstante Spalte hat keine definierte Korrelation und ergibt stattdessen NaN.
Für Zusammenhänge, die durchgehend steigen oder fallen, ohne einer Geraden zu folgen, berechnet method="spearman" die Korrelation aus Rängen. Die Methode ändert, welche Art von Muster zusammengefasst wird; nenne sie daher bei der Berichterstattung über ein Ergebnis.
Die Wetterberechnung verwendet nur sieben Messwerte. Sie beschreibt diese kleine beobachtete Woche; starke Aussagen über ein umfassenderes Klimamuster benötigen mehr Belege. Ein aussagekräftiger Bericht enthält die Variablen, das Vorzeichen und die Größe des Koeffizienten, die Methode und die Anzahl der Beobachtungen.
Wichtige Erkenntnisse
value_countsgibt absolute Häufigkeiten aus; die Normierung gibt Anteile der gezählten Werte an.unique,nuniqueundmodebeantworten unterschiedliche Fragen zu verschiedenen und häufigen Werten.- Die Summe einer Bedingung zählt Treffer und ihr arithmetisches Mittel gibt einen Anteil an.
- Die Pearson-Korrelation misst den linearen Zusammenhang von −1 bis 1.
- Eine Korrelationsmatrix ist symmetrisch; konstante Spalten ergeben undefinierte Korrelationen.
- Die Spearman-Rangkorrelation arbeitet mit Rängen, und eine Korrelation allein belegt keine Ursache.
Einstieg in pandas: Beispiele
1Eine Tabelle mit aussagekräftigen Bezeichnungen erstellen
12 Schritte
- 1EinführungWerte mit ihrer Bedeutung verbunden halten
Eine Liste liefert Werte in einer Reihenfolge. pandas ergänzt Bezeichnungen, damit du erkennen kannst, was jeder Wert beschreibt, auch nachdem Zeilen verschoben wurden. Beginne mit einer Variablen mit Bezeichnungen und kombiniere dann mehrere Variablen zu einer Tabelle.
Die entscheidende Frage ist, ob eine Operation der Identität einer Zeile oder ihrer aktuellen Position folgt. Diese Unterscheidung erklärt sowohl die Arithmetik mit Series als auch die Wahl eines nützlichen Tabellenindex.
- 2BeispielEine Niederschlags-Series mit Bezeichnungen erstellen
Erstelle drei Niederschlagsmesswerte in Millimetern:
rain = pd.Series([4.5, 3.0, 6.2], index=["Mon", "Tue", "Wed"], name="rain_mm")Werte und Bezeichnungen werden der Reihe nach zugeordnet.
rain["Tue"]ergibt 3.0, währendrain.iloc[0]4.5 ergibt. Die erste Anforderung nennt einen Tag, die zweite eine Position..dtypeistfloat64und.sizeist 3. - 3ErklärungEine Regel auf jeden Wert anwenden
Eine Series unterstützt vektorisierte Operationen:
rain * 2verdoppelt jeden Messwert und behält die Tagesbezeichnungen.rain > 4erzeugt True, False und True, wiederum nach Tagen bezeichnet.Verwende Attribute wie
.index,.nameund.dtypeohne Klammern. Wenn du die Werte als NumPy-Array brauchst, rufe.to_numpy()auf;.valueskann bei manchen Datentypen ein pandas-Array zurückgeben. - 4BeispielNach Bezeichnung statt nach angezeigter Zeile addieren
a enthalte x 1, y 2 und z 3, während b y 10, z 20 und w 30 enthält. In
a + bwird y mit y gepaart und ergibt 12.0; z wird mit z gepaart und ergibt 23.0.Die Bezeichnungen x und w haben kein Gegenstück, daher sind ihre Ergebnisse NaN.
a.add(b, fill_value=0)ergibt stattdessen x 1.0 und w 30.0. Eine gemeinsame Zeilenposition paart keine Einträge mit unterschiedlichen Bezeichnungen. - 5HerausforderungEine ausgerichtete Summe vorhersagen
Eine Series hat die Bezeichnungen a und b mit den Werten 4 und 7. Eine andere hat die Bezeichnungen b und c mit den Werten 3 und 9. Welche Ergebnisse der gewöhnlichen Addition sind nicht fehlend?
---reveal---
Nur b ist in beiden Eingaben vorhanden. Seine Summe ist 7 plus 3, also 10.0. Die Bezeichnungen a und c haben fehlende Ergebnisse. Eine Addition des jeweils ersten Werts würde a fälschlich mit b paaren.
- 6BeispielMehrere Variablen als Spalten erstellen
Erstelle eine kleine Bestelltabelle:
df = pd.DataFrame({"product": ["Notebook", "Mug"], "quantity": [3, 4], "unit_price": [2.5, 6.0]})Jede Liste liefert eine Spalte und muss einen Wert pro Zeile enthalten. Die Spalten teilen sich die Indexbezeichnungen 0 und 1, behalten aber ihre eigenen Datentypen.
.shapeist(2, 3), während.sizegleich 6 ist, weil es jede Zelle zählt. - 7KernaussageDie für den nächsten Schritt benötigte Form erhalten
df["quantity"]gibt eine Series zurück.df[["quantity"]]gibt einen DataFrame mit einer Spalte zurück, weil die innere Liste eine Sammlung von Spalten anfordert.Dies ist ein Unterschied im Aufbau, obwohl die sichtbaren Werte übereinstimmen. Eckige Klammern vermeiden auch Namenskollisionen: Eine Spalte namens size benötigt
df["size"], dadf.sizedie Zellenanzahl des DataFrames bezeichnet. - 8HerausforderungDie Richtung einer Summe wählen
Was ergibt für die Spalten a
[1, 2]und b[3, 4]eine zeilenweise Summe und mit welcher Achse wird sie angefordert?---reveal---
Verwende
df.sum(axis=1). Die erste Zeile ergibt 1 plus 3, also 4; die zweite ergibt 2 plus 4, also 6. Die Standardachse arbeitet entlang der Zeilen und würde stattdessen die Spaltensummen a 3 und b 7 ergeben. - 9BeispielDie Bestell-ID als Index verwenden
Speichere für eine Tabelle mit einer Spalte order_id
by_id = orders.set_index("order_id"). Die Bestellnummern werden in den Zeilenindex und aus den gewöhnlichen Spalten verschoben.Eine Abfrage wie
by_id.loc[1004]bezeichnet nun eine Bestellung statt ihrer aktuellen Position. Prüfeby_id.index.is_unique, bevor du dich darauf verlässt, dass jede Nummer genau eine Zeile identifiziert; pandas erlaubt doppelte Bezeichnungen. - 10TippEine Änderung von Bezeichnungen speichern
rename,drop,set_indexundreset_indexgeben neue Tabellen zurück. Behalte das Ergebnis durch Zuweisung, etwa mitorders = orders.rename(columns={"unit_price": "price"}).Ohne Zuweisung bleibt die alte Tabelle bestehen. Ein falsch geschriebener alter Spaltenname in rename wird standardmäßig ignoriert. Untersuche daher
.columns, wenn der erwartete neue Name fehlt. - 11HerausforderungIDs wiederherstellen, ohne sie zu verlieren
Eine Tabelle verwendet Bestell-IDs als Index. Du benötigst einen Standardzeilenindex und brauchst die IDs weiterhin als Daten. Welche Operation solltest du speichern?
---reveal---
Speichere
df = df.reset_index(). Dies erhält den alten Index als Spalte und vergibt die Bezeichnungen 0, 1, 2 und so weiter. Mitdrop=Truewürdest du diese IDs stattdessen verwerfen. Die Zeilenreihenfolge bleibt gleich. - 12ZusammenfassungIdentität, Typ und Form vorhersagen
Prüfe vor dem Lesen eines Ergebnisses drei Dinge: welche Bezeichnungen seine Werte identifizieren, welcher Datentyp sie speichert und wie viele Achsen die Auswahl behält.
Die Arithmetik mit Series folgt den Bezeichnungen. Ein DataFrame organisiert Variablen in Spalten mit Datentypen. Indexänderungen ermöglichen aussagekräftige IDs für spätere Abfragen, sofern die zurückgegebene Tabelle gespeichert wird und ihre Bezeichnungen Zeilen eindeutig identifizieren.
2Eine CSV-Datei laden und ihre Bedeutung prüfen
13 Schritte
Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.
- 1EinführungDas Laden als überprüfbaren Schritt behandeln
- 2ErklärungDatensätze in eine Tabelle einlesen
- 3BeispielTrennzeichen und Dezimalzeichen abstimmen
- 4TippCodes beim Einlesen erhalten
- 5HerausforderungDen ersten Datensatz erhalten
- 6BeispielDen sichtbaren Aufbau prüfen
- 7ErklärungVorhandene und fehlende Werte zählen
- 8HerausforderungEine ID und einen Messwert prüfen
- 9BeispielZahlentext umwandeln und einen Fehler zurückverfolgen
- 10KernaussageAnzahlen mit fehlenden Werten als Ganzzahlen speichern
- 11BeispielDatumsoperationen ermöglichen
- 12HerausforderungEinen numerischen Import korrigieren
- 13ZusammenfassungAufbau, Datentypen und Anzahlen verbinden
3Zeilen nach Identität oder Position auswählen
10 Schritte
Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.
- 1EinführungFragen, ob Identität oder Position wichtig ist
- 2BeispielEine bekannte Bestellung auslesen
- 3BeispielEinen bezeichnungsbasierten Bereich einschließlich beider Endpunkte auslesen
- 4HerausforderungEine Tabelle mit einer Zeile erhalten
- 5BeispielEinen Positionsbereich auslesen
- 6TippRückwärts und über das Ende hinaus auswählen
- 7HerausforderungEine Zeile und einen einzelnen Wert unterscheiden
- 8VerbindungEine Kurzform für eine Zelle verwenden
- 9HerausforderungEine Zeile beim Sortieren verfolgen
- 10ZusammenfassungAuswahl und Form angeben
4Datensätze filtern und die richtige Tabelle aktualisieren
13 Schritte
Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.
- 1EinführungEine Datenfrage in einen Zeilentest umwandeln
- 2BeispielEine boolesche Maske erstellen
- 3ErklärungBeide Bedingungen voraussetzen
- 4TippEinen einzelnen Wahrheitswert nur bei Bedarf verwenden
- 5HerausforderungEine kombinierte Bedingung zählen
- 6BeispielEinen Wertebereich direkt ausdrücken
- 7KernaussageLücken mit einem Fehlwerttest finden
- 8HerausforderungEinen Filter in query übertragen
- 9BeispielGenau die Home-Preise reduzieren
- 10ErklärungVerstehen, warum eine Verkettung die Ursprungstabelle verfehlt
- 11TippAktualisierungswerte nach Bezeichnung zuordnen
- 12HerausforderungFiltern und Aktualisieren kombinieren
- 13ZusammenfassungBedingungen und Ziele ausdrücklich angeben
5Aus vorhandenen Spalten nützliche neue Daten erzeugen
12 Schritte
Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.
- 1EinführungEine Regel einmal für jede Spalte ausdrücken
- 2BeispielEinen Umsatz pro Bestellung berechnen
- 3KernaussageDen Nenner eines Mittelwerts auslesen
- 4BeispielEine Spalte innerhalb einer Kette hinzufügen
- 5HerausforderungEine eingehende Series zuordnen
- 6BeispielBezeichnungen anhand eines Schwellenwerts wählen
- 7ErklärungÜber die Bedeutung nicht aufgeführter Werte entscheiden
- 8HerausforderungEine Methode zur teilweisen Umkodierung wählen
- 9TippFunktionen übergeben, ohne sie aufzurufen
- 10BeispielWerte begrenzen, ohne Datensätze zu entfernen
- 11HerausforderungEine berechnete und umkodierte Spalte nachvollziehen
- 12ZusammenfassungDie Regel und Eingaben ohne Zuordnung prüfen
6Daten ordnen und ihre Zusammenfassungen interpretieren
18 Schritte
Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.
- 1EinführungDie Ansicht wählen, die die Frage beantwortet
- 2BeispielPunkte vor Namen sortieren
- 3TippEine Rangbindung an der Auswahlgrenze vollständig behalten
- 4HerausforderungReihenfolge der Bezeichnungen von der Wertereihenfolge unterscheiden
- 5BeispielDas Mittel der bei Rangbindungen belegten Plätze berechnen
- 6ErklärungZwischen Lücken und aufeinanderfolgenden Gruppen wählen
- 7HerausforderungEinen relativen Rang auslesen
- 8BeispielEine Wetterzusammenfassung erstellen
- 9ErklärungDen Nenner für die Streuung abstimmen
- 10BeispielQuartile und einen Mittelwert bei Schiefe auslesen
- 11HerausforderungEin arithmetisches Mittel anhand seiner Anzahl prüfen
- 12BeispielKategorien und Anteile zählen
- 13KernaussageDrei Fragen zu Werten unterscheiden
- 14HerausforderungEine Bedingung als Anteil zählen
- 15ErklärungEinen Zusammenhang genau beschreiben
- 16HerausforderungNach der Datenprüfung eine Matrix auslesen
- 17HerausforderungEine Zusammenfassung wählen und berichten
- 18ZusammenfassungDie Regel jeder Zusammenfassung sichtbar halten
Einstieg in pandas: Übungsaufgaben
Set 1: Eine pandas-Tabelle auslesen und verwenden10 Übungsfragen
Frage 1 von 10
s = pd.Series([8, 13, 5], index=[2, 0, 1]). Was gibt s[0] zurück?Antwort zeigenAntwort ausblenden
s.iloc[0]; ganzzahlige Schlüssel in eckigen Klammern bleiben Bezeichnungen.Frage 2 von 10
[4.0, NaN, 9.0] und stellt ganzzahlige Stückzahlen dar. Welcher Datentyp kann die Lücke erhalten und bekannte Anzahlen als Ganzzahlen speichern?Antwort zeigenAntwort ausblenden
Int64 mit Fehlwertunterstützung und großem I speichert ganze Zahlen und stellt den fehlenden Eintrag als <NA> dar. Das gewöhnliche int64 hat kein Fehlwertkennzeichen und kann dieses NaN nicht umwandeln. Text würde eine Darstellung der Einträge erhalten, aber keine numerischen ganzzahligen Anzahlen speichern.Frage 3 von 10
[30, 10, 20]. Welche Zeile wählt df.loc[10] aus?Antwort zeigenAntwort ausblenden
loc interpretiert 10 als Indexbezeichnung und wählt daher die zweite angezeigte Zeile aus. Es zählt nicht zehn Positionen vorwärts. Die Position der Zeile kann sich nach dem Sortieren ändern, ihre Bezeichnung bleibt aber gleich, bis der Index ausdrücklich geändert wird.Frage 4 von 10
df hat die Kategoriewerte ["A", "B", "A", "B"] und die Massen [3, 7, 9, 4]. Welche Bezeichnungen erfüllen beim Standardindex (df["category"] == "A") | (df["mass_kg"] > 6)?Antwort zeigenAntwort ausblenden
& statt | verwendet.Frage 5 von 10
[2.0, 5.0, NaN] und die Stückpreise [7.0, 3.0, 9.0]. Was ist das standardmäßige arithmetische Mittel ihrer zeilenweisen Produkte?Antwort zeigenAntwort ausblenden
Frage 6 von 10
[5.0, NaN, 2.0]. Wo erscheint NaN bei einer standardmäßigen absteigenden Sortierung nach Werten?Antwort zeigenAntwort ausblenden
na_position="first" nötig.Frage 7 von 10
a = pd.Series([6, 9], index=["east", "west"]) und b = pd.Series([4, 7], index=["west", "east"]). Was sind (a + b).loc["east"] und (a + b).loc["west"]?Antwort zeigenAntwort ausblenden
Frage 8 von 10
df.isna().any(axis=1).sum() zurück?Antwort zeigenAntwort ausblenden
any(axis=1) reduziert jede Zeile auf eine Antwort: ob sie mindestens eine Lücke enthält. Beide betroffenen Zeilen sind True, sodass die Summe 2 ist. Die Addition der Anzahlen fehlender Werte über alle Spalten würde vier Zellen ergeben, aber dieser Ausdruck zählt Zeilen nur einmal.Frage 9 von 10
["Zoe", "Ari", "Bo", "Dee"] mit den Punktzahlen [8, 8, 10, 8]. Welche Namen erscheinen in welcher Reihenfolge, wenn nach Punktzahl absteigend und nach Name aufsteigend sortiert und anschließend die ersten zwei Zeilen ausgewählt werden?Antwort zeigenAntwort ausblenden
Frage 10 von 10
s enthält ["A", "B", "C", "A", "B"]. Was sind nach s.replace({"C": "B"}) der Modalwert und seine relative Häufigkeit?Antwort zeigenAntwort ausblenden
Set 2: Die passende pandas-Operation wählen10 Übungsfragen
Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.
Frage 1 von 10
.size?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 2 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 3 von 10
df hat fünf Zeilen. Welche Zeilenpositionen wählt df.iloc[1:4] aus?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 4 von 10
chosen = df[df["active"]] die Zuweisung chosen["score"] = 0. Was geschieht mit df?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 5 von 10
[4, 6, 9] aus np.where(s >= 6, "large", "small")?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 6 von 10
[90, 70, 90, 50] werden mit method="min", ascending=False Ränge zugewiesen. Welche Ränge ergeben sich in der ursprünglichen Zeilenreihenfolge?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 7 von 10
code;mass_kg, gefolgt von 007;1,5 und 012;2,0. Welche Art des Ladens erhält die Codes und ermöglicht die numerische Berechnung der mittleren Masse?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 8 von 10
df hat den Index [10, 20, 30] und die Umsätze [12.0, 24.0, 36.0]. Einer neuen Spalte wird df.loc[df["revenue"] > 15, "revenue"] / 2 zugewiesen. Was ist die standardmäßige Summe der neuen Spalte?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 9 von 10
[12, 4, 12, 8] werden mit der Standardmethode und pct=True aufsteigend Ränge zugewiesen. Welchen relativen Rang erhält jeder Wert 12?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 10 von 10
df.index ist ["a", "b", "a"]. Welchen Typ hat df.loc["a"]?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Set 3: Zeilen, Datentypen und Berechnungen prüfen10 Übungsfragen
Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.
Frage 1 von 10
df hat einen unbenannten Index [40, 60]. Was macht df.reset_index() mit diesen Bezeichnungen?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 2 von 10
501,Sensor. Wie sollte sie mit den Spalten id und device geladen werden, ohne den ersten Datensatz zu verlieren?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 3 von 10
df.loc[12:14, ["mass_kg"]] bei einem geordneten Index [11, 12, 13, 14]?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 4 von 10
cutoff = 6. Wie kann query Zeilen auswählen, deren mass_kg diese Python-Variable übersteigt?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 5 von 10
pd.Series([-2, 6, 14]).clip(lower=0, upper=10)?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 6 von 10
["L", "M", "L", None]. Welchen Anteil weist das standardmäßige value_counts(normalize=True) L zu?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 7 von 10
a = pd.Series([5, 8], index=["u", "v"]) und b = pd.Series([2, 4], index=["v", "w"]). Es sei c = a.add(b, fill_value=0). Was ist c[c > 4].sum()?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
df hat den Index [4, 8, 12] und die Gleitkommapreise [10.0, 20.0, 30.0]. Eine Maske wählt die Bezeichnungen 4 und 12 aus. Wie lauten die Preise in der ursprünglichen Zeilenreihenfolge nach df.loc[mask, "price"] = pd.Series([7.0, 9.0], index=[12, 4])?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 10 von 10
[11, 9, 9, 6]. Wie viele Zeilen und welche kleinste Punktzahl gibt df.nlargest(2, "score", keep="all") zurück?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Set 4: Mehrere Operationen gemeinsam nachvollziehen10 Übungsfragen
Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.
Frage 1 von 10
df = pd.DataFrame({"a": [2, 5], "b": [7, 1]}). Welche Werte gibt df.sum(axis=1) in Zeilenreihenfolge zurück?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 2 von 10
s = pd.Series(["8", "bad", "2.5"]). Wie lauten die Werte nach pd.to_numeric(s, errors="coerce")?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 3 von 10
[7, 2, 9] und die x-Werte [4, 12, 8]. Es sei d = df.sort_values("x", ascending=False). Was ist d.iloc[:2]["x"].sum() - d.loc[7, "x"]?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 4 von 10
[2, 5, 8] erfüllen .between(2, 8, inclusive="neither")?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 5 von 10
df hat den Index [5, 9, 12], die Mengen [2, 3, 4] und die Preise [6, 5, 2]. Der DataFrame erhält eine Umsatzspalte, behält Umsätze über 10 und erhält dann pd.Series([20.0], index=[9]) als adjusted. Was ist das standardmäßige arithmetische Mittel von adjusted?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 6 von 10
[3.0, 7.0, NaN, 8.0]. Was sind ihr standardmäßiges arithmetisches Mittel und ihre Anzahl nicht fehlender Werte?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 7 von 10
df = pd.DataFrame({"a": [2, 6], "b": [5, 3]}, index=[8, 4]). Was sind nach df = df.T die Werte von df.shape und df.loc["b"].sum()?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 8 von 10
"1,500", "800", "unknown", "200" und hat bisher keine Lücken. Was sind nach dem Entfernen der Kommas, einer numerischen Typumwandlung mit Fehlerersetzung und der Berechnung des standardmäßigen arithmetischen Mittels der Mittelwert und die Anzahl neuer Lücken?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 9 von 10
[2.0, NaN, 8.0, 5.0]. Was ist die Summe der durch s.notna() & (s != 5) & (s < 8) ausgewählten Werte?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 10 von 10
[1, 2, 3, 4, 40] mm. Das arithmetische Mittel ist 10 mm und der Median ist 3 mm. Warum beschreibt der Median hier einen typischen Messwert besser?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Set 5: Probleme bei Ausrichtung und Zusammenfassung lösen10 Übungsfragen
Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.
Frage 1 von 10
df gespeichert. Die nächste Zeile lautet df.reset_index(). Warum schlägt df.loc[0] weiterhin fehl?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 2 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 3 von 10
[8, 3, 6, 1]. Welche Bezeichnungen bleiben in df.iloc[-2:][["x"]]?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 4 von 10
df hat den Index ["k", "m", "p"], a [4, 8, 12] und b [3, 1, 5]. Es sei d = df.loc[(df["a"] >= 8) & (df["b"] < 4), ["a", "b"]]. Was ist d.sum(axis=1).iloc[0]?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 5 von 10
["Probe A", "sensor", None, "PROBE B"]. Welche Standardzeilenbezeichnungen erfüllen .str.contains("probe", case=False, na=False)?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 6 von 10
df hat Standardbezeichnungen und die Gleitkommapreise [8.0, 12.0, 18.0]. Nach mask = df["price"] >= 12 folgt df.loc[mask, "price"] = pd.Series([9.0], index=[2]). Was gibt df["price"].count() zurück?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 7 von 10
[60, 90, 90, 75] in Zeilenreihenfolge. Ein absteigender lückenloser Rang wird als place zugewiesen und die Tabelle wird stabil nach place aufsteigend sortiert. Welche ursprünglichen Zeilenbezeichnungen erscheinen zuerst?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 8 von 10
s = pd.Series(["X", "Y", "X", "Z"]). Was sind nach t = s.map({"X": 4, "Y": 10}) die Werte von t.count() und t.mean()?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 9 von 10
s enthält [2.0, 4.0, 6.0]. Was sind s.std() und np.std(s.to_numpy()), gerundet auf drei Nachkommastellen?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 10 von 10
df hat x [1, 2, 3, 4], y [100, 6, 4, 2] und z [5, 5, 5, 5]. Welche Werte erscheinen nach df.loc[df["x"] > 1, ["x", "y", "z"]].corr() für x mit y und für z mit sich selbst?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Hängst du bei deiner eigenen Aufgabe fest? Hausaufgabenhilfe
Schlüsselbegriffe
A
Abfragevariable
limit = 5 vergleicht query("unit_price > @limit") Preise mit diesem Python-Wert.Absolute Häufigkeiten
Achse
df.sum(axis=1) addiert die ausgewählten numerischen Spalten innerhalb jeder Zeile und ergibt eine Summe pro Zeile.Aggregation
agg(["mean", "max"]) gibt für jede ausgewählte numerische Spalte zwei unterschiedliche Zusammenfassungen aus.Anzahl nicht fehlender Werte
Anzahl unterschiedlicher Werte
Arbeitsverzeichnis
Arithmetisches Mittel
assign
at
orders.at[2, "product"] liest das Produkt bei Bezeichnung 2 in einer Bestelltabelle mit Standardindex aus.Aufsteigende Reihenfolge
ascending=False, wenn eine Ergebnistabelle die höchsten Punktzahlen zuerst anzeigen soll.Ausrichtung anhand von Indexbezeichnungen
B
Bedingte Aktualisierung
df.loc[mask, "price"] *= 0.9 reduziert die Preise genau der Zeilen, die von der Maske für die Preisaktualisierung ausgewählt wurden.Bedingte Auswahl
Beobachtung
Berechnete Spalte
between
between(5, 20, inclusive="left") schließt 5 ein, aber 20 aus dem Preisintervall aus.Bezeichnungsbasierter Slice
.loc[1002:1004] die drei Bestellbezeichnungen 1002, 1003 und 1004 ein.Boolesche Maske
Boolesche Reduktion
.any() einer Maske kann beantworten, ob mindestens einer Bestellung eine Mengenangabe fehlt.Broadcasting eines Skalars
C
Copy-on-Write
CSV
D
DataFrame
Datentyp (dtype)
float64 verwenden, wenn bei einem Datensatz eine leere Mengenangabe als NaN eingelesen wird.dt-Accessor
.dt.day_name() den Wochentag jedes Bestelldatums zurück.Dublettenprüfung
duplicated(subset="product") spätere Notebook-Einträge, auch wenn sich alle Bestell-IDs unterscheiden.E
Eindeutigkeit des Index
.index.is_unique, bevor du erwartest, dass eine Bestell-ID genau eine Zeile zurückgibt.Elementweises ODER
Elementweises UND
Ersetzung
F
Fehlwertkennzeichen
na_values=["-"] teilt dem CSV-Leser mit, dass ein Bindestrich in der Datei einen fehlenden Eintrag darstellt.Filtern
Form (Shape)
(6, 4) und 24 Zellen.G
Ganzzahldatentyp mit Fehlwertunterstützung
"Int64" verwenden, statt bei der Umwandlung in das gewöhnliche int fehlzuschlagen.Gleitkommafehler
1.9000000000000001 anzeigen; dieser Wert kann auf zwei Nachkommastellen gerundet werden.I
iat
orders.iat[2, 2] liest die Zelle in der dritten Zeile und dritten Spalte einer Bestelltabelle aus.iloc
.iloc[-1] gibt die letzte Zeile zurück, auch wenn ihre Indexbezeichnung eine Bestellnummer wie 1006 ist.Index
population["Lima"] den Wert einer Stadt anfordern, ohne ihre Position zu kennen.isin
["Home", "Bags"] ersetzt zwei durch ODER verknüpfte Gleichheitsvergleiche.isna
K
Kategorialer Datentyp
min() nicht zu, auch wenn ihre angezeigten Bezeichnungen gewöhnlicher Text sind.Kopfzeile
header=None, wenn die erste Zeile einen tatsächlichen Datensatz enthält, der in den Daten bleiben muss.Korrelationsmatrix
Kumulative Summe
L
loc
.loc[1004, "product"] das Produkt einer bestimmten Bestellung auszuwählen.Lückenloser Rang
M
Median
Minimaler Rang
Mittlerer Rang
Modalwert
N
NaN
Negativer Positionsindex
P
Pearson-Korrelation
Platzierung fehlender Werte
na_position="first" angefordert wird.Positionsbasierter Slice
.iloc[1:3] gibt die Positionen 1 und 2 zurück und kann sich von einem loc-Slice mit eingeschlossenem Endpunkt unterscheiden.Q
Quantil
quantile(0.25) kann für eine Temperaturspalte ein unteres Quartil zwischen zwei gemessenen Temperaturen ergeben.query
query("quantity >= 2 and unit_price < 5") kann einen kombinierten Bestellfilter klar ausdrücken.R
Rang
Rang nach Auftretensreihenfolge
RangeIndex
reset_index(drop=True) die erhaltenen Bezeichnungen durch einen neuen Standardindex.Relative Häufigkeit
Relativer Rang
rename
rename(columns={"unit_price": "price"}) ändert den Namen einer Spalte, ohne ihre Werte zu ändern.reset_index
reset_index() wieder zu einer Spalte order_id.S
Series
set_index
orders.set_index("order_id") macht eine Bestellnummer zur Bezeichnung für spätere Zeilenabfragen.Skalar
Skalare Zuweisung
Sortierschlüssel
Spalte
Spaltenauswahl
["product", "unit_price"] die anzuzeigenden Spalten auswählt.Spearman-Rangkorrelation
Stabile Sortierung
kind="stable" behält zwei gleiche Punktzahlen in ihrer bisherigen Reihenfolge, statt eine neue Regel für den Gleichstand festzulegen.Standardabweichung
str-Accessor
orders["product"].str.len() berechnet für jedes erfasste Produkt eine Namenslänge.T
Textmusterabgleich
"note" mit case=False trifft auf Notebook zu, obwohl dessen N großgeschrieben ist.Top-n-Auswahl
nlargest(1, "points", keep="all") gibt zwei Zeilen zurück, wenn zwei Personen dieselbe höchste Punktzahl haben.Trennzeichen
sep=";", auch wenn Zahlen in ihren Feldern Dezimalkommas verwenden.Typinferenz
"001" in 1 umwandeln, sofern ihr Datentyp nicht als Text festgelegt wird.Typumwandlung
.dt.month anforderst, und weise die umgewandelte Series dann zurück.Typumwandlung mit Fehlerersetzung
"7", "unknown", "2.5" mit errors auf coerce erzeugt einen neuen fehlenden Eintrag.V
Varianz
Vektorisierte Operation
Verkettete Zuweisung
Vorschau
head(3) kannst du die Kopfzeile und die ersten drei Datensätze prüfen, ohne jede Zeile anzuzeigen.W
Wertbegrenzung (Clipping)
Z
Zeilenweises Anwenden mit apply
Zufallsstichprobe
sample(3, random_state=0) ist nützlich, um Zeilen außerhalb des Anfangs oder Endes einer Tabelle zu prüfen.Zuordnung mit einem Dictionary
Zusammenhang
Über diese Einheit
Erstelle deine eigenen Lernmaterialien
Mach aus deinen Notizen, Folien und Dokumenten Lernleitfäden, Übungsfragen, Karteikarten und 6 weitere Tools.