Pandas Categorical-Typ
Categorical ist ein Datentyp in Pandas, der für die Verarbeitung endlicher Kategoriewerte verwendet wird und sich besonders für die Verarbeitung enumerierter Daten wie Geschlecht, Bildung, Niveau usw. eignet. Der Categorical-Typ kann den Speicherverbrauch erheblich reduzieren und die Rechenleistung verbessern.
Kategorische Daten erstellen
Aus Series erstellen
Beispiel
import pandas as pd
# Kategorische Daten erstellen
s = pd.Series(["Male", "Female", "Male", "Female", "Male"], dtype="category")
print("Grundlegende kategorische Daten:")
print(s)
print(f"Typ: {s.dtype}")
print()
# Kategorienreihenfolge angeben
s2 = pd.Series(
["Low", "Medium", "High", "Medium", "Low"],
dtype=pd.CategoricalDtype(categories=["Low", "Mittel", "Hoch"], ordered=True)
)
print("Geordnete Kategorien:")
print(s2)
print(f"Kategorie-Reihenfolge: {s2.dtype.categories.tolist()}")
# Kategorische Daten erstellen
s = pd.Series(["Male", "Female", "Male", "Female", "Male"], dtype="category")
print("Grundlegende kategorische Daten:")
print(s)
print(f"Typ: {s.dtype}")
print()
# Kategorienreihenfolge angeben
s2 = pd.Series(
["Low", "Medium", "High", "Medium", "Low"],
dtype=pd.CategoricalDtype(categories=["Low", "Mittel", "Hoch"], ordered=True)
)
print("Geordnete Kategorien:")
print(s2)
print(f"Kategorie-Reihenfolge: {s2.dtype.categories.tolist()}")
Erstellen aus einer Liste
Beispiel
import pandas as pd
# pd.Categorical verwenden
categories = pd.Categorical(
["A", "B", "A", "C", "B"],
categories=["A", "B", "C"]
)
s = pd.Series(categories)
print("Erstellen aus Categorical:")
print(s)
# pd.Categorical verwenden
categories = pd.Categorical(
["A", "B", "A", "C", "B"],
categories=["A", "B", "C"]
)
s = pd.Series(categories)
print("Erstellen aus Categorical:")
print(s)
Kategorieattribute und -methoden
Zugriff auf Kategorieinformationen
Beispiel
import pandas as pd
s = pd.Series(
["Low", "Medium", "High", "Medium", "Low"],
dtype=pd.CategoricalDtype(categories=["Low", "Mittel", "Hoch"], ordered=True)
)
# Kategorieattribute
print(f"Kategorien: {s.dtype.categories.tolist()}")
print(f"Geordnet: {s.dtype.ordered}")
print()
# Anzahl jeder Kategorie zählen
print("Kategorienstatistik:")
print(s.value_counts())
s = pd.Series(
["Low", "Medium", "High", "Medium", "Low"],
dtype=pd.CategoricalDtype(categories=["Low", "Mittel", "Hoch"], ordered=True)
)
# Kategorieattribute
print(f"Kategorien: {s.dtype.categories.tolist()}")
print(f"Geordnet: {s.dtype.ordered}")
print()
# Anzahl jeder Kategorie zählen
print("Kategorienstatistik:")
print(s.value_counts())
Kategorien ändern
Beispiel
import pandas as pd
s = pd.Series(["A", "B", "C", "A", "B"], dtype="category")
print("Kategorienamen ändern:")
s2 = s.cat.rename_categories({"A": "Ausgezeichnet", "B": "Gut", "C": "Bestanden"})
print(s2)
print()
# Eine neue Kategorie hinzufügen
print("Kategorie hinzufügen:")
s3 = s.cat.add_categories(["D"])
print(s3.dtype.categories.tolist())
print()
# Kategorie entfernen
print("Kategorie entfernen:")
s4 = s.cat.remove_categories(["C"])
print(s4.dtype.categories.tolist())
s = pd.Series(["A", "B", "C", "A", "B"], dtype="category")
print("Kategorienamen ändern:")
s2 = s.cat.rename_categories({"A": "Ausgezeichnet", "B": "Gut", "C": "Bestanden"})
print(s2)
print()
# Eine neue Kategorie hinzufügen
print("Kategorie hinzufügen:")
s3 = s.cat.add_categories(["D"])
print(s3.dtype.categories.tolist())
print()
# Kategorie entfernen
print("Kategorie entfernen:")
s4 = s.cat.remove_categories(["C"])
print(s4.dtype.categories.tolist())
Geordnete Kategorien
Geordnete Kategorien unterstützen Vergleichsoperationen und eignen sich für kategoriale Daten mit einer Größenordnung.
Beispiel
import pandas as pd
# Geordnete Kategorien erstellen
s = pd.Series(
["Niedrig", "Mittel", "Hoch", "Hoch", "Niedrig", "Mittel"],
dtype=pd.CategoricalDtype(categories=["Low", "Mittel", "Hoch"], ordered=True)
)
# Vergleichsoperationen
print("Hoch > Mittel:", s > "Mittel")
print("Mittel > Niedrig:", s > "Niedrig")
print()
# Sortieren
print("Nach dem Sortieren:")
print(s.sort_values())
# Geordnete Kategorien erstellen
s = pd.Series(
["Niedrig", "Mittel", "Hoch", "Hoch", "Niedrig", "Mittel"],
dtype=pd.CategoricalDtype(categories=["Low", "Mittel", "Hoch"], ordered=True)
)
# Vergleichsoperationen
print("Hoch > Mittel:", s > "Mittel")
print("Mittel > Niedrig:", s > "Niedrig")
print()
# Sortieren
print("Nach dem Sortieren:")
print(s.sort_values())
Übung: Daten gruppieren
Beispiel
import pandas as pd
# Simuliere Benutzer-Level-Daten
users = pd.DataFrame({
"Benutzer-ID": range(1, 1001),
"Level": pd.Categorical(
["VIP"] * 100 + ["Goldkarte"] * 300 + ["Silberkarte"] * 400 + ["Regulär"] * 200,
categories=["Regulär", "Silberkarte", "Goldkarte", "VIP"],
ordered=True
),
"Consumption Amount": [1000, 500, 100, 50] * 250
})
print("Verteilung der Benutzerebenen:")
print(users["Level"].value_counts().sort_index())
print()
# Statistiken nach Level gruppieren
print("Statistiken nach Level:")
print(users.groupby("Level", observed=True)["Consumption Amount"].sum())
# Simuliere Benutzer-Level-Daten
users = pd.DataFrame({
"Benutzer-ID": range(1, 1001),
"Level": pd.Categorical(
["VIP"] * 100 + ["Goldkarte"] * 300 + ["Silberkarte"] * 400 + ["Regulär"] * 200,
categories=["Regulär", "Silberkarte", "Goldkarte", "VIP"],
ordered=True
),
"Consumption Amount": [1000, 500, 100, 50] * 250
})
print("Verteilung der Benutzerebenen:")
print(users["Level"].value_counts().sort_index())
print()
# Statistiken nach Level gruppieren
print("Statistiken nach Level:")
print(users.groupby("Level", observed=True)["Consumption Amount"].sum())
Speicheroptimierung
Der kategorische Typ kann den Speicherverbrauch von String-Daten stark reduzieren.
Beispiel
import pandas as pd
import numpy as np
# Eine große Menge wiederholter String-Daten erstellen
np.random.seed(42)
s_str = pd.Series(np.random.choice(["Peking", "Shanghai", "Guangzhou", "Shenzhen"], 1000000))
# In kategorischen Typ umwandeln
s_cat = s_str.astype("category")
# Speichervergleich
print(f"Speicher für String-Typ: {s_str.memory_usage(deep=True) / 1024 / 1024:.2f} MB")
print(f"Speicher für kategorischen Typ: {s_cat.memory_usage(deep=True) / 1024 / 1024:.2f} MB")
print(f"Gespart: {(1 - s_cat.memory_usage(deep=True) / s_str.memory_usage(deep=True)) * 100:.1f}%")
import numpy as np
# Eine große Menge wiederholter String-Daten erstellen
np.random.seed(42)
s_str = pd.Series(np.random.choice(["Peking", "Shanghai", "Guangzhou", "Shenzhen"], 1000000))
# In kategorischen Typ umwandeln
s_cat = s_str.astype("category")
# Speichervergleich
print(f"Speicher für String-Typ: {s_str.memory_usage(deep=True) / 1024 / 1024:.2f} MB")
print(f"Speicher für kategorischen Typ: {s_cat.memory_usage(deep=True) / 1024 / 1024:.2f} MB")
print(f"Gespart: {(1 - s_cat.memory_usage(deep=True) / s_str.memory_usage(deep=True)) * 100:.1f}%")
Andere ErweiterungenWenn in den Daten viele wiederholte String-Werte vorkommen, kann die Verwendung des kategorischen Typs den Speicherverbrauch erheblich reduzieren, wodurch er sich besonders für große Datensätze eignet.