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()}")

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)

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())

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())

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())

Ü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())

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}%")

Wenn 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.

Andere Erweiterungen