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