Pandas-Datenauswahl (loc / iloc / at)
Die Datenauswahl ist eine der am häufigsten verwendeten Operationen in Pandas. Das Verständnisloc、iloc、atder Unterschiede und Anwendungsfälle ermöglicht es Ihnen, Daten effizienter zu verarbeiten.
Unterschied zwischen loc und iloc
| Merkmal | loc | iloc |
|---|---|---|
| Indexierungsmethode | Label-basierte Indexierung | Integer-basierte (positionsbezogene) Indexierung |
| Slicing | Schließt die Endposition ein | Schließt die Endposition aus |
| Einzelner Wert | Gibt einen Skalar zurück | Gibt einen Skalar zurück |
| Empfohlenes Szenario | Wenn explizite Index-Labels vorhanden sind | Beim Auswählen nach Position |
Beispiel
# Beispiel-DataFrame erstellen
df = pd.DataFrame({
"Name": ["Zhang San", "Li Si", "Wang Wu", "Zhao Liu", "Qian Qi"],
"Alter": [25, 30, 28, 35, 22],
"City": ["Beijing", "Shanghai", "Guangzhou", "Shenzhen", "Hangzhou"]
}, index=[1, 3, 5, 7, 9]) # Hinweis: Der Index ist nicht fortlaufend
print("DataFrame:")
print(df)
print()
# loc: Label-Indizierung verwenden (Ende inklusive)
print("df.loc[1:5] (Label-Slice, enthält 5):")
print(df.loc[1:5])
print()
# iloc: Positionsindizierung verwenden (Ende ausschließlich)
print("df.iloc[0:2] (Positions-Slice, schließt 2 aus):")
print(df.iloc[0:2])
Verwendung von loc
Zeilen auswählen
Beispiel
df = pd.DataFrame({
"Name": ["Zhang San", "Li Si", "Wang Wu", "Zhao Liu"],
"Alter": [25, 30, 28, 35],
"City": ["Beijing", "Shanghai", "Guangzhou", "Shenzhen"]
}, index=["a", "b", "c", "d"])
# Eine einzelne Zeile auswählen (gibt eine Series zurück)
print("Eine Zeile auswählen:")
print(df.loc["a"])
print()
# Mehrere Zeilen auswählen
print("Mehrere Zeilen auswählen:")
print(df.loc[["a", "c"]])
print()
# Slice-Auswahl (schließt Start und Ende ein)
print("Slice-Auswahl:")
print(df.loc["a":"c"])
Spalten auswählen
Beispiel
df = pd.DataFrame({
"Name": ["Zhang San", "Li Si", "Wang Wu"],
"Alter": [25, 30, 28],
"City": ["Beijing", "Shanghai", "Guangzhou"]
}, index=["a", "b", "c"])
# Eine einzelne Spalte auswählen
print("Eine einzelne Spalte auswählen:")
print(df.loc[:, "Name"])
print()
# Mehrere Spalten auswählen
print("Mehrere Spalten auswählen:")
print(df.loc[:, ["Name", "City"]])
print()
# Slice-Auswahl von Spalten
print("Spalten per Slice auswählen:")
print(df.loc[:, "Name":"City"])
Auswählen bestimmter Zeilen und Spalten (empfohlene Vorgehensweise)
Beispiel
df = pd.DataFrame({
"Name": ["Zhang San", "Li Si", "Wang Wu", "Zhao Liu"],
"Alter": [25, 30, 28, 35],
"City": ["Beijing", "Shanghai", "Guangzhou", "Shenzhen"]
}, index=["a", "b", "c", "d"])
# Bestimmte Zeilen und Spalten auswählen
print("Einen einzelnen Wert auswählen:")
print(df.loc["a", "Name"]) # Gibt "Zhang San" zurück
print(type(df.loc["a", "Name"])) # Der Typ ist str
print()
# Mehrere Zeilen und Spalten auswählen
print("Teilmenge auswählen:")
print(df.loc[["a", "c"], ["Name", "City"]])
print()
# Bedingte Auswahl
print("Zeilen mit Age größer als 28:")
print(df.loc[df["Age"] > 28])
Verwendung von iloc
Auswahl nach Position
Beispiel
df = pd.DataFrame({
"Name": ["Zhang San", "Li Si", "Wang Wu", "Zhao Liu"],
"Alter": [25, 30, 28, 35],
"City": ["Beijing", "Shanghai", "Guangzhou", "Shenzhen"]
})
# Zeile 0 auswählen
print("Zeile 0 auswählen:")
print(df.iloc[0])
print()
# Die ersten 3 Zeilen auswählen
print("Die ersten 3 Zeilen auswählen:")
print(df.iloc[:3])
print()
# Bestimmte Zeilen auswählen
print("Bestimmte Zeilen auswählen:")
print(df.iloc[[0, 2, 3]])
print()
# Negative Indizierung (vom Ende aus)
print("Die letzte Zeile auswählen:")
print(df.iloc[-1])
print()
print("Die letzten 3 Zeilen auswählen:")
print(df.iloc[-3:])
Spalten auswählen
Beispiel
df = pd.DataFrame({
"Name": ["Zhang San", "Li Si", "Wang Wu"],
"Alter": [25, 30, 28],
"City": ["Beijing", "Shanghai", "Guangzhou"]
})
# Spalte 0 auswählen
print("Spalte 0:")
print(df.iloc[:, 0])
print()
# Spalten 1 und 2 auswählen
print("Mehrere Spalten auswählen:")
print(df.iloc[:, [1, 2]])
print()
# Slice-Auswahl
print("Spalten per Slice auswählen:")
print(df.iloc[:, 0:2])
at und iat (einen einzelnen Wert abrufen)
atundiatsind Zugriffsmethoden speziell für das Abrufen/Setzen eines einzelnen Werts, was schneller ist alslocundiloc>更快。
Beispiel
import time
import numpy as np
# Erstelle einen großen DataFrame für Leistungstests
df = pd.DataFrame(np.random.randn(1000, 10), columns=[f"col_{i}" for i in range(10)])
# at ruft einen einzelnen Wert ab (Label-Indizierung)
print(f"at: {df.at[0, 'col_0']}")
# iat ruft einen einzelnen Wert ab (Positionsindizierung)
print(f"iat: {df.iat[0, 0]}")
# Leistungsvergleich
n = 10000
start = time.time()
for _ in range(n):
_ = df.iloc[0, 0]
print(f"iloc time: {time.time() - start:.4f}s")
start = time.time()
for _ in range(n):
_ = df.iat[0, 0]
print(f"iat-Zeit: {time.time() - start:.4f}s")
Bedingte Auswahl
Das Filtern von Daten mithilfe boolescher Bedingungen ist eine der häufigsten Operationen.
Beispiel
df = pd.DataFrame({
"Name": ["Zhang San", "Li Si", "Wang Wu", "Zhao Liu"],
"Alter": [25, 30, 28, 35],
"City": ["Beijing", "Shanghai", "Guangzhou", "Beijing"],
"Salary": [12000, 15000, 11000, 18000]
})
# Einzelne Bedingung
print("Mitarbeiter älter als 28:")
print(df[df["Age"] > 28])
print()
# Mehrere Bedingungen (mit & | ~)
print("Peking und Gehalt größer als 12000:")
print(df[(df["City"] == "Peking") & (df["Salary"] > 12000)])
print()
# isin-Filterung
print("Stadt ist Beijing oder Shanghai:")
print(df[df["City"].isin(["Beijing", "Shanghai"])])
print()
# String-Enthaltensein
print("Name enthält 'San':")
print(df[df["Name"].str.contains("San")])
Hinweise
1. Slicing schließt die Endposition ein
locSlicing schließt die Endposition ein,ilocenthält es nicht.
2. Es tritt ein Fehler auf, wenn der Index nicht existiert
Verwendunglocwenn der Index nicht existiert, wird ein KeyError ausgelöst. Sie könnenloc[index_list]in Kombination mitreindex。
3. Die Verwendung wird empfohlenloc
becauselocBesser lesbar und weniger fehleranfällig, es sei denn, Sie müssen nach Position auswählen.
Weitere Erweiterungen
at/iatIst der schnellste Weg, auf einen einzelnen Wert zuzugreifen.loc/ilocWird verwendet, um mehrere Werte auszuwählen. Die Wahl der geeigneten Methode kann die Leistung und Lesbarkeit des Codes verbessern.