Kategorischer Datentyp
Konvertieren Sie String-Spalten mit wenigen unterschiedlichen Werten in pandas Categorical, um den Speicherbedarf zu reduzieren und groupby-Operationen zu beschleunigen.
Kategorischer Datentyp ist eine kostenlose Pandas & NumPy Academy-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Pandas & NumPy Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Pandas & NumPy Academy-Kurs umfasst insgesamt 4 Lektionen.
Was ist der Categorical-Dtype?
Der Categorical-Dtype in Pandas ist für Spalten vorgesehen, die eine begrenzte Menge diskreter Werte mit geringer Kardinalität enthalten, etwa Geschlecht, Status, Region oder Produktkategorie. Statt den vollständigen String für jede Zeile zu speichern, legt Pandas die eindeutigen Werte (die sogenannten Kategorien) einmal ab und verwendet pro Zeile einen Integer-Code als Verweis darauf. Das ähnelt der Verwendung von Nachschlagetabellen oder Enum-Typen in Datenbanken.
import pandas as pd
df = pd.DataFrame({
'region': ['North', 'South', 'East', 'North', 'East', 'South'] * 1000
})
# Without Categorical: object dtype stores every string
print('object dtype memory:', df['region'].memory_usage(deep=True))
# With Categorical: only stores 3 unique values + integer codes
df['region_cat'] = df['region'].astype('category')
print('category dtype memory:', df['region_cat'].memory_usage(deep=True))Eine Categorical Series erstellen
Konvertieren Sie eine Spalte in Categorical, indem Sie auf einer beliebigen Series .astype('category') aufrufen. Die resultierende Categorical Series speichert die eindeutigen Werte in .cat.categories und die Integer-Positionscodes in .cat.codes. Sie können eine Categorical auch direkt mit pd.Categorical() erstellen, um Kategorien und ihre Reihenfolge von Anfang an festzulegen.
import pandas as pd
s = pd.Series(['low', 'high', 'med', 'high', 'low'])
s_cat = s.astype('category')
print(s_cat.cat.categories) # Index(['high', 'low', 'med'], dtype='object')
print(s_cat.cat.codes) # integer codes per row
# 0 1
# 1 0
# 2 2
# 3 0
# 4 1Speicher mit Categorical einsparen
Die Speichereinsparung durch den Categorical-Dtype hängt vom Kardinalitätsverhältnis ab (eindeutige Werte ÷ Gesamtzahl der Zeilen). Bei 5 eindeutigen Strings in einer Spalte mit 1.000.000 Zeilen speichert der object-Dtype 1 Million String-Zeiger (jeweils etwa 50+ Bytes), während Categorical nur 5 Strings plus 1 Million 8-Bit-Ganzzahlen speichert. Die Einsparung kann das 5- bis 20-Fache betragen und eine 50-MB-Spalte auf 2–5 MB reduzieren.
import pandas as pd
import numpy as np
n = 1_000_000
statuses = np.random.choice(['active', 'inactive', 'pending'], size=n)
df = pd.DataFrame({'status': statuses})
object_mem = df['status'].memory_usage(deep=True) / 1e6
df['status'] = df['status'].astype('category')
cat_mem = df['status'].memory_usage(deep=True) / 1e6
print(f'Object dtype: {object_mem:.1f} MB')
print(f'Category dtype: {cat_mem:.1f} MB')
print(f'Reduction: {object_mem/cat_mem:.1f}x')Geordnete Categorical-Werte zum Rangieren
Manchmal haben Kategorien eine natürliche Reihenfolge — etwa 'low' < 'medium' < 'high' oder T-Shirt-Größen XS < S < M < L < XL. Ein geordnetes Categorical bildet diese Rangfolge ab, ermöglicht sinnvolle Vergleichsoperatoren (<, >= usw.) und stellt sicher, dass groupby-Ergebnisse in der korrekten semantischen Reihenfolge statt alphabetisch sortiert werden.
import pandas as pd
df = pd.DataFrame({
'priority': ['high', 'low', 'medium', 'high', 'low']
})
priority_type = pd.CategoricalDtype(
categories=['low', 'medium', 'high'],
ordered=True
)
df['priority'] = df['priority'].astype(priority_type)
# Comparison now works correctly
print(df['priority'] >= 'medium')
# 0 True
# 1 False
# 2 True
# 3 True
# 4 FalseGeordnete Categorical-Werte sortieren
Wenn Sie eine geordnete Categorical-Spalte sortieren, verwendet Pandas die definierte Kategorienreihenfolge statt der alphabetischen Reihenfolge. Das bedeutet, dass 'low' unabhängig davon, wie diese Werte als Zeichenfolgen sortiert würden, vor 'medium' und 'medium' vor 'high' steht. Das ist entscheidend für korrekt geordnete Übersichtstabellen und Diagramme.
import pandas as pd
df = pd.DataFrame({
'severity': pd.Categorical(
['high', 'low', 'medium', 'low', 'high'],
categories=['low', 'medium', 'high'],
ordered=True
),
'count': [5, 20, 8, 15, 3]
})
# sort_values respects the categorical order
print(df.sort_values('severity')[['severity', 'count']])
# severity count
# 1 low 20
# 3 low 15
# 2 medium 8
# 0 high 5
# 4 high 3GroupBy-Geschwindigkeit mit Categorical
Pandas kann groupby()-Operationen auf Categorical-Spalten optimieren, da alle möglichen Gruppen im Voraus bekannt sind. Dadurch kann groupby bei großen DataFrames 2- bis 5-mal schneller werden. Außerdem gibt groupby bei Categorical alle Kategorien zurück – auch leere. So enthalten Ihre Übersichtstabellen immer eine Zeile für jede erwartete Gruppe, selbst wenn einige Gruppen null Beobachtungen aufweisen.
import pandas as pd
import numpy as np
np.random.seed(0)
df = pd.DataFrame({
'region': pd.Categorical(
np.random.choice(['North', 'South', 'East', 'West'], 10),
categories=['North', 'South', 'East', 'West']
),
'sales': np.random.randint(100, 1000, 10)
})
# observed=False shows ALL categories even empty ones
print(df.groupby('region', observed=False)['sales'].sum())Kategorien hinzufügen und entfernen
Verwenden Sie den .cat-Accessor, um die Kategorienliste zu verwalten. .cat.add_categories() fügt neue zulässige Werte hinzu (nützlich, bevor Sie neue Daten einfügen), und .cat.remove_unused_categories() entfernt Kategorienbezeichnungen, denen keine Zeilen entsprechen – praktisch nach dem Filtern. Sie können keinen Wert zuweisen, der nicht in den Kategorien enthalten ist, ohne ihn vorher hinzuzufügen.
import pandas as pd
s = pd.Categorical(['a', 'b', 'a'], categories=['a', 'b', 'c'])
s = pd.Series(s)
print(s.cat.categories) # Index(['a', 'b', 'c'], dtype='object')
print(s.value_counts()) # a:2, b:1, c:0
# Remove unused category 'c'
s = s.cat.remove_unused_categories()
print(s.cat.categories) # Index(['a', 'b'], dtype='object')Kategorienbezeichnungen umbenennen
Mit .cat.rename_categories() können Sie Kategorien neu beschriften, ohne die zugrunde liegenden Codes zu ändern. Das ist nützlich, wenn Sie verständlichere Namen anzeigen möchten (z. B. 'M' → 'Male') oder eine uneinheitliche Groß- und Kleinschreibung der Bezeichnungen korrigieren möchten, ohne wieder in object zu konvertieren und eine neue Zuordnung vorzunehmen. Die Methode akzeptiert eine Liste (positionsbezogen) oder ein Dictionary (gezielt).
import pandas as pd
s = pd.Series(pd.Categorical(['M', 'F', 'M', 'F'], categories=['M', 'F']))
# Rename using a dict
s = s.cat.rename_categories({'M': 'Male', 'F': 'Female'})
print(s)
# 0 Male
# 1 Female
# 2 Male
# 3 Female
print(s.cat.categories) # Index(['Male', 'Female'], dtype='object')Wann Sie Categorical NICHT verwenden sollten
Der Datentyp Categorical ist bei hoher Kardinalität eine schlechte Wahl – wenn fast jede Zeile einen eindeutigen Wert enthält (etwa Benutzer-IDs, Freitextkommentare oder UUIDs), ist der Kategorienindex nahezu so groß wie die ursprünglichen Daten und spart keinen Speicher. Als Faustregel gilt: Verwenden Sie Categorical nur, wenn die Anzahl eindeutiger Werte weniger als ungefähr 50 % der Gesamtzeilen beträgt, insbesondere wenn es sich um einige Dutzend oder Hundert eindeutige Werte handelt.
import pandas as pd
import numpy as np
df = pd.DataFrame({'user_id': range(1_000_000)})
# High-cardinality: every value is unique — don't use Categorical
object_mem = df['user_id'].astype(str).memory_usage(deep=True) / 1e6
cat_mem = df['user_id'].astype(str).astype('category').memory_usage(deep=True) / 1e6
print(f'String: {object_mem:.1f} MB')
print(f'Category: {cat_mem:.1f} MB')
# Category is WORSE for high-cardinality data!Categorical in Pivot-Tabellen und Groupby
Die Verwendung von Categorical sorgt für eine konsistente Ausgabeform bei Ergebnissen von groupby und Pivot-Tabellen. Ohne Categorical werden Gruppen, die zufällig keine Beobachtungen enthalten, stillschweigend aus dem Ergebnis weggelassen. Das kann beim Vergleich verschiedener Datenausschnitte zu nicht ausgerichteten Ausgaben führen. Mit Categorical und observed=False werden immer alle Gruppen in der Ausgabe angezeigt.
import pandas as pd
df = pd.DataFrame({
'quarter': pd.Categorical(
['Q1', 'Q1', 'Q3'],
categories=['Q1', 'Q2', 'Q3', 'Q4']
),
'revenue': [100, 200, 300]
})
# observed=False includes Q2 and Q4 even though they have no rows
result = df.groupby('quarter', observed=False)['revenue'].sum()
print(result)
# quarter
# Q1 300
# Q2 0
# Q3 300
# Q4 0Categorical und maschinelles Lernen
Viele scikit-learn-Schätzer erwarten numerische Eingaben. Um eine Categorical-Spalte für ein Modell in Zahlen umzuwandeln, verwenden Sie .cat.codes (Label-Encoding) oder pd.get_dummies() (One-Hot-Encoding). One-Hot-Encoding vermeidet, dass eine ordinale Beziehung zwischen den Kategorien nahegelegt wird. Für geordnete Categorical-Spalten wie Prioritätsstufen ist Label-Encoding (also die direkten Codes) geeignet und erhält die Reihenfolgeinformationen.
import pandas as pd
df = pd.DataFrame({
'colour': pd.Categorical(['red', 'blue', 'green', 'red'])
})
# One-hot encode for unordered categories
one_hot = pd.get_dummies(df['colour'], prefix='colour')
print(one_hot)
# colour_blue colour_green colour_red
# 0 0 0 1
# 1 1 0 0
# 2 0 1 0
# 3 0 0 1Schnelltest
Testen Sie Ihr Verständnis des Datentyps Categorical.
Lektionszusammenfassung
In dieser Lektion haben Sie gelernt: Der Categorical-Datentyp speichert eindeutige Werte nur einmal und verwendet Ganzzahlencodes pro Zeile, wodurch bei Spalten mit niedriger Kardinalität viel Speicher eingespart wird. Geordnetes Categorical unterstützt sinnvolle Vergleiche und eine korrekte Sortierung, und groupby mit observed=False schließt alle Kategorien ein, auch leere. Vermeiden Sie Categorical bei Spalten mit hoher Kardinalität. Als Nächstes analysieren wir Datumszeichenfolgen mit pd.to_datetime() korrekt.
Lerne Python mit einem KI-Tutor — kostenlos
Schreibe und führe echten Code in deinem Browser aus, bekomme sofortige Hilfe von einem 24/7 KI-Tutor und setze dein Lernen im Web oder in der App fort.
- Kurse
- 30
- Lektionen
- 120
Häufig gestellte Fragen
Ist die Lektion „Kategorischer Datentyp“ kostenlos?
Ja — der vollständige Text von „Kategorischer Datentyp“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Pandas & NumPy Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Pandas & NumPy Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Kategorischer Datentyp“?
Konvertieren Sie String-Spalten mit wenigen unterschiedlichen Werten in pandas Categorical, um den Speicherbedarf zu reduzieren und groupby-Operationen zu beschleunigen. Du übst Pandas & NumPy Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Pandas & NumPy Academy zu starten?
Keine Vorkenntnisse erforderlich. Pandas & NumPy Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.
Wie lange dauert die Lektion „Kategorischer Datentyp“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Pandas & NumPy Academy-Lektion Code schreiben und ausführen?
Ja. Jede Pandas & NumPy Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Datentypen von Spalten untersuchen
- Typumwandlung mit astype()
- Kategorischer Datentyp
- Datumsangaben korrekt parsen