Einführung
Die Iteration über Zeilen stellt häufig einen der größten Leistungsengpässe im Pandas-Code dar. Während dies bei kleinen Datensätzen oft unbemerkt bleibt, wird es bei der Verarbeitung großer Datenmengen deutlich spürbar.
Pandas basiert auf NumPy, das Operationen auf gesamten Arrays gleichzeitig unter Verwendung von kompilierter C-Code ausführt. Das Durchlaufen von Zeilen in Python umgeht diese Effizienz und zwingt jede Operation zurück in den Python-Interpreter – und das zeilenweise.
In diesem Artikel werden sieben Alternativen zu Schleifen in Pandas vorgestellt, die jeweils für unterschiedliche Arten von Transformationen geeignet sind. Am Ende werden Sie ein klares Verständnis dafür haben, welches Werkzeug Sie je nach Problemstellung einsetzen sollten. Eine gute Möglichkeit, die Effizienz Ihrer Datenpipelines zu steigern, sind leistungsstarke Python-Dekoratoren.
Einrichtung des Beispiel-Datensatzes
Für die Demonstration verwenden wir einen realistischen Datensatz von E-Commerce-Bestellungen:
import pandas as pd
import numpy as np
np.random.seed(42)
n = 100_000
categories = ['Electronics', 'Clothing', 'Home & Kitchen', 'Sports', 'Books']
regions = ['North', 'South', 'East', 'West']
df = pd.DataFrame({
'order_id': range(1, n + 1),
'customer_age': np.random.randint(18, 70, n),
'product_category': np.random.choice(categories, n),
'region': np.random.choice(regions, n),
'price': np.round(np.random.uniform(5.0, 500.0, n), 2),
'quantity': np.random.randint(1, 10, n),
'days_to_ship': np.random.randint(1, 14, n),
})
display(df.head())
Nun haben wir einen Datensatz mit 100.000 Zeilen zur Verfügung.
1. Verwendung von vektorisierten Operationen für arithmetische Berechnungen
Bei arithmetischen oder Vergleichsoperationen auf einer Spalte sollten vektorisierte Operationen Ihre erste Wahl sein.
Was wir tun möchten: den Gesamtumsatz pro Bestellung berechnen.
df['revenue'] = df['price'] * df['quantity']
display(df[['price', 'quantity', 'revenue']].head())
2. Anwendung einer Funktion für bedingte Logik
Wenn Ihre Transformation eine Logik beinhaltet, die nicht als einfache Arithmetik ausgedrückt werden kann, ermöglicht .apply() das Übergeben einer Funktion über eine Spalte oder Zeile.
Was wir tun möchten: ein Versandprioritätslabel basierend auf den Versandtagen zuweisen.
def shipping_label(days):
if days <= 3:
return 'High Priority'
elif days <= 7:
return 'Medium Priority'
else:
return 'Low Priority'
df['shipping_priority'] = df['days_to_ship'].apply(shipping_label)
display(df[['days_to_ship', 'shipping_priority']].head())
3. Verwendung von np.where() für binäre Bedingungen
Bei binären Bedingungen – einem Ergebnis, wenn wahr, einem anderen, wenn falsch – ist np.where() die saubere und schnelle Wahl.
Was wir tun möchten: Bestellungen kennzeichnen, bei denen der Kunde für einen Senior-Rabatt qualifiziert ist.
df['senior_discount'] = np.where(df['customer_age'] >= 60, True, False)
display(df[['customer_age', 'senior_discount']].head())
4. Auswahl über mehrere Bedingungen mit np.select()
Wenn Sie mehr als zwei Bedingungen haben, ermöglicht np.select() das Definieren einer Liste von Bedingungen und entsprechenden Werten, ohne dass verschachtelte if/elif-Ketten erforderlich sind.
Was wir tun möchten: einen regionenbasierten Steuersatz zuweisen.
conditions = [
df['region'] == 'North',
df['region'] == 'South',
df['region'] == 'East',
df['region'] == 'West',
]
tax_rates = [0.08, 0.06, 0.07, 0.09]
df['tax_rate'] = np.select(conditions, tax_rates, default=0.07)
df['tax_amount'] = df['price'] * df['tax_rate']
display(df[['region', 'price', 'tax_rate', 'tax_amount']].head())
5. Werte mit einer Dictionary-Suche zuordnen
Wenn Sie Werte in einer Spalte übersetzen müssen – wie das Zuordnen von Kategorienamen zu numerischen Codes oder das Ersetzen von Schlüsseln durch Bezeichnungen – ist .map() mit einem Dictionary sauber und schnell.
Was wir tun möchten: Produktkategorien internen Abteilungscodes zuordnen.
category_codes = {
'Electronics': 'ELEC',
'Clothing': 'CLTH',
'Home & Kitchen': 'HOME',
'Sports': 'SPRT',
'Books': 'BOOK',
}
df['dept_code'] = df['product_category'].map(category_codes)
display(df[['product_category', 'dept_code']].head())
6. Zeichenfolgen mit dem .str-Zugriff bearbeiten
Bei der Zeichenfolgenmanipulation greifen viele fälschlicherweise auf Schleifen oder .apply() zurück. Der .str-Zugriff ermöglicht es Ihnen, Zeichenfolgenoperationen über eine gesamte Spalte hinweg auszuführen, ohne diese Methoden.
Was wir tun möchten: das erste Wort aus der Spalte product_category extrahieren und in Kleinbuchstaben umwandeln.
df['category_slug'] = df['product_category'].str.split().str[0].str.lower()
display(df[['product_category', 'category_slug']].head())
7. Aggregation von Gruppen mit .groupby()
Ein häufiges Schleifenmuster besteht darin, über Teilmengen von Daten zu iterieren, um gruppenbasierte Statistiken zu berechnen. .groupby() übernimmt dies nativ.
Was wir tun möchten: den Gesamtumsatz und die durchschnittlichen Versandtage pro Produktkategorie berechnen.
summary = (
df.groupby('product_category')
.agg(
total_revenue=('revenue', 'sum'),
avg_ship_days=('days_to_ship', 'mean'),
order_count=('order_id', 'count')
)
.round(2)
.reset_index()
)
summary
Die Wahl des richtigen Werkzeugs
Die meisten Transformationen, für die Sie eine Schleife schreiben würden, passen gut in eines dieser Muster:
- Arithmetik auf Spalten: Führen Sie vektorisierte mathematische Operationen wie Addition, Subtraktion, Multiplikation und Division direkt auf DataFrame-Spalten aus.
- Vektorisierte Operationen: Wenden Sie elementweise Operationen effizient auf gesamte Spalten an, ohne explizite Schleifen.
- Einfache wahr/falsch-Bedingungen: Bewerten Sie boolesche Bedingungen, um bedingte Spalten zu filtern oder zu erstellen.
- np.where(): Wenden Sie bedingte (if-else) Logik vektorisierte Weise auf Arrays und DataFrame-Spalten an.
- Mehrere Bedingungen, mehrere Ergebnisse: Behandeln Sie komplexe bedingte Logik mit mehreren Regeln und Ausgaben.
- Wertsubstitution über Lookup: Ersetzen Sie Werte mithilfe von Zuordnungs-Dictionaries für schnelle Transformationen.
- .apply(): Wenden Sie benutzerdefinierte Funktionen zeilen- oder spaltenweise für flexible Transformationen an.
- Zeichenfolgenmanipulation: Verwenden Sie vektorisierte Zeichenfolgenoperationen über den .str-Zugriff zur Bereinigung und Transformation von Textdaten.
- .groupby() + .agg(): Gruppieren Sie Daten und berechnen Sie aggregierte Statistiken wie Summe, Mittelwert, Anzahl usw.
Sobald Sie anfangen, in Spalten und nicht in Zeilen zu denken, wird die Pandas-API weniger wie ein Umweg und mehr wie die tatsächlich beabsichtigte Arbeitsweise erscheinen. Wenn Sie mehr über die Struktur von Datensätzen erfahren möchten, lesen Sie wie die Struktur von Datensätzen den Programmierstil beeinflusst. Für eine tiefere Automatisierung Ihrer Datenanalyse sind effiziente Python-Skripte zur Automatisierung der explorativen Datenanalyse von großem Nutzen.
„`
Quellen: kdnuggets
Bildquelle: KI generiert
🚀