HOWTO · Pandas
Eindeutige Pandas-Werte in einer Spalte abrufen und diese sortieren
Dieses Tutorial demonstriert, wie man eindeutige Werte einer Spalte im Pandas DataFrame findet und diese sortiert
Auf dieser Seite
Eine DataFrame-Spalte ist eine Pandas-Series. Rufen Sie deren unique()-Funktion auf, um die unterschiedlichen Werte in der Reihenfolge ihres ersten Auftretens zu erhalten. Verwenden Sie drop_duplicates(), wenn Sie die zugehörigen Zeilen samt ihrer übrigen Spalten benötigen, oder sortieren Sie die Werte beziehungsweise Zeilen mit Pythons sorted() oder Pandas sort_values().
Die Beispiele verwenden denselben kleinen DataFrame mit Berufen und Abteilungen. Führen Sie dieses Beispiel aus. Die Bezeichner und Ausgaben in den unveränderten Beispielen bleiben auf Englisch:
import pandas as pd
df = pd.DataFrame({
"profession": ["designer", "engineer", "designer", "analyst"],
"department": ["product", "platform", "research", "finance"],
})
professions = df["profession"].unique()
print(professions)
print(type(professions).__name__)
<StringArray>
['designer', 'engineer', 'analyst']
Length: 3, dtype: str
StringArray
Eindeutige Werte aus einer DataFrame-Spalte abrufen
Durch die Auswahl von df["profession"] erhalten Sie eine Series. Ihre unique()-Funktion gibt für jeden unterschiedlichen Beruf einen Wert zurück, und zwar in der Reihenfolge des ersten Auftretens; sortiert werden die Werte dabei nicht. Der konkrete Ergebnistyp hängt vom Datentyp der Series ab. In diesem Beispiel haben die Werte den String-Erweiterungsdatentyp von Pandas, daher ist das Ergebnis, wie in der Ausgabe zu sehen, ein StringArray. Bei anderen Datentypen kann ein NumPy-Array oder ein anderes Erweiterungsarray entstehen. Passen Sie den Spaltennamen an Ihre Daten an. Wenn Sie nur die Anzahl der unterschiedlichen Werte benötigen, verwenden Sie len(df["profession"].unique()); len(df) zählt dagegen die Zeilen, auch wenn Berufe mehrfach vorkommen. Wandeln Sie das Ergebnis mit .tolist() um, wenn der nächste Schritt ausdrücklich eine gewöhnliche Python-Liste benötigt.
Für jeden eindeutigen Spaltenwert eine Zeile beibehalten
Wenn Sie Datensätze beibehalten möchten, statt nur eine Sammlung von Werten zu erhalten, rufen Sie drop_duplicates(subset="profession") für den DataFrame auf. Das Ergebnis bleibt ein DataFrame: Jede beibehaltene Zeile enthält auch ihre Abteilung, und standardmäßig bleibt die erste Zeile für jeden Beruf erhalten. In der gezeigten Ausgabe wird die zweite Zeile für Designer entfernt; die erste Designer-Zeile mit ihrer Produktabteilung bleibt bestehen. Dabei wird keine repräsentative Zeile anhand einer anderen Regel ausgewählt. Sortieren Sie die Zeilen zuerst oder wählen Sie sie anderweitig aus, wenn ein anderer Datensatz erhalten bleiben soll. Standardmäßig bleiben die ursprünglichen Indexbezeichnungen erhalten, sodass der Index Lücken haben kann. Sie können mehrere Spaltennamen als Liste an subset übergeben, wenn Datensätze anhand einer Kombination von Spalten als Duplikate gelten. Die Bezeichner und Ausgaben im unveränderten Beispiel bleiben auf Englisch.
import pandas as pd
df = pd.DataFrame({
"profession": ["designer", "engineer", "designer", "analyst"],
"department": ["product", "platform", "research", "finance"],
})
unique_rows = df.drop_duplicates(subset="profession")
print(unique_rows.to_string(index=False))
print(type(unique_rows).__name__)
profession department
designer product
engineer platform
analyst finance
DataFrame
Eindeutige Werte oder DataFrame-Zeilen sortieren
Pythons eingebaute Funktion sorted() gibt eine neue Liste mit aufsteigend sortierten Werten zurück. Um die unterschiedlichen Werte zu sortieren, kombinieren Sie sie mit unique(). Alternativ können Sie die Series direkt sortieren, wenn Duplikate erhalten bleiben sollen. Für eine absteigende Sortierung übergeben Sie reverse=True an sorted().
Verwenden Sie sort_values(by="profession"), wenn die sortierten Zeilen und ihre übrigen Spalten zusammenbleiben sollen. Das Ergebnis ist ein DataFrame; standardmäßig wird aufsteigend sortiert. Für eine absteigende Sortierung setzen Sie ascending=False. Die Beispiele zeigen zwei Alternativen: Beim Sortieren der eindeutigen Werte erhalten Sie eine Liste, beim Sortieren der Zeilen bleiben die Zeilendaten erhalten. Sie können an by eine Liste übergeben, um nach mehreren Spalten in Prioritätsreihenfolge zu sortieren. Die gezeigten Listen enthalten nur Berufswerte. Die letzte Ausgabe enthält dagegen weiterhin alle Zeilen samt Abteilungen und ordnet die Berufe absteigend, vom Ingenieur bis zum Analysten. sort_values() behält die ursprünglichen Indexbezeichnungen bei, sofern Sie nicht ignore_index=True angeben; dadurch erhält das sortierte Ergebnis einen neuen fortlaufenden Index. Die Bezeichner und Ausgaben im unveränderten Beispiel bleiben auf Englisch.
import pandas as pd
df = pd.DataFrame({
"profession": ["designer", "engineer", "designer", "analyst"],
"department": ["product", "platform", "research", "finance"],
})
print(sorted(df["profession"].unique()))
print(sorted(df["profession"].unique(), reverse=True))
print(df.sort_values(by="profession", ascending=False).to_string(index=False))
['analyst', 'designer', 'engineer']
['engineer', 'designer', 'analyst']
profession department
engineer platform
designer product
designer research
analyst finance