)}"
pd.factorize()Ist eine Pandas-Bibliotheksfunktion, die zumKodieren kategorialer Variablen verwendet wird.Die Funktion wandelt kategoriale Daten in ganzzahlige Codes um und gibt eine Liste eindeutiger Werte zurück.
Es ist eine gängige Technik in der Vorverarbeitung für maschinelles Lernen, die Textkategorien in numerische Werte umwandelt, was es Algorithmen erleichtert, sie zu verarbeiten. Im Vergleich zum One-Hot-Encoding (pd.get_dummies()), die Faktorisierungskodierung erhöht die Datendimension nicht.
Wortdefinition: factorizeBedeutet „Faktorisierung“, hier bezogen auf die Umwandlung kategorialer Variablen in numerische Faktoren (Ganzzahlcodes).
Grundlegende Syntax und Parameter
pd.factorize()Es ist eine Top-Level-Funktion der Pandas-Bibliothek, die verwendet wird, um kategoriale Variablen als Ganzzahlen zu kodieren.
Syntaxformat
pd.factorize(values, sort=False, na_sentinel=-1, size_hint=None)
Parameterbeschreibung
- Parameter:
values- Typ: Array-ähnliches Objekt, wie Series, list, array usw.
- Beschreibung: Die zu kodierenden kategorialen Daten.
- Parameter:
sort- Typ: Boolescher Wert.
- Wenn es
True, sortiert die eindeutigen Werte vor der Kodierung. Standard istFalse(in Reihenfolge des Auftretens kodieren).
na_sentinel
- Type: Integer.
- Integer used to mark missing values. Default is
-1. If set toNone, missing values will be kept as NaN.
Funktionsbeschreibung
- Rückgabewert: Gibt ein Tupel (codes, uniques) zurück, wobei codes das kodierte Integer-Array und uniques das Array der eindeutigen Werte ist.
- Wirkung: Ordnet kategorische Variablen einer Integer-Sequenz beginnend bei 0 zu, wobei jeder eindeutige Wert einer Ganzzahl entspricht.
Beispiele
Lass uns dies anhand einer Reihe von Beispielen von einfach bis komplex gründlich meisternpd.factorize()seine Verwendung gründlich beherrschen.
Beispiel 1: Grundlegende Verwendung - Kodierung kategorischer Variablen
Beispiel
import numpy as np
# 1. Kategorische Daten erstellen
colors = pd.Series(['red', 'blue', 'green', 'red', 'blue', 'yellow'])
print("=== Ursprüngliche kategorische Daten ===")
print(colors)
# 2. pd.factorize() zur Kodierung verwenden
codes, uniques = pd.factorize(colors)
print("\n=== pd.factorize() Kodierungsergebnis ===")
print(fKodierung: {codes}) # Kodierte Ganzzahl
print(fEindeutige Werte: {uniques}) # uniqueValueList
print(f"Typ: {type(codes)}")
Erwartete Ausgabe:
=== 原始分类数据 === 0 red 1 blue 2 green 3 red 4 blue 5 yellow 原始数据中 'red' 出现 2 次,'blue' 出现 2 次,'green' 和 'yellow' 各出现 1 次。 按出现顺序分配编码: - 'red' -> 0 - 'blue' -> 1 - 'green' -> 2 - 'yellow' -> 3 === 编码: [0 1 2 0 1 3] === 唯一值数组: ['red' 'blue' 'green' 'yellow']
Code-Erklärung:
- Das zurückgegebene codes ist ein Integer-Array, wobei jeder ursprüngliche Wert durch den entsprechenden Integer-Code ersetzt wird.
- Das uniques-Array speichert alle eindeutigen Werte, angeordnet in der entsprechenden Reihenfolge der Kodierung.
- Standardmäßig werden Codes in der Reihenfolge ihres Auftretens zugewiesen (der zuerst auftretende Wert wird als 0 kodiert).
Beispiel 2: sort-Parameter - Eindeutige Werte vor der Kodierung sortieren
Verwendungsort=TrueDu kannst die eindeutigen Werte vor der Kodierung sortieren, wodurch die Ergebnisse vorhersehbarer werden.
Beispiel
import numpy as np
# Kategorische Daten erstellen
colors = pd.Series(['red', 'blue', 'green', 'red', 'blue', 'yellow'])
print(=== Rohdaten ===)
print(colors)
# 1. Keine Sortierung (Standard) - in Reihenfolge des Auftretens kodieren
codes_unsorted, uniques_unsorted = pd.factorize(colors, sort=False)
print("\n=== sort=False (Standard) ===")
print(f"Codes: {codes_unsorted}")
print(fEindeutige Werte: {uniques_unsorted})
# 2. Nach dem Sortieren kodieren - in alphabetischer Reihenfolge
codes_sorted, uniques_sorted = pd.factorize(colors, sort=True)
print("\n=== sort=True (in alphabetischer Reihenfolge) ===)
print(fCodes: {codes_sorted})
print(f"Eindeutige Werte: {uniques_sorted}")
# 3. Numerische Werte sortieren
numbers = pd.Series([5, 2, 8, 5, 3, 2, 9])
codes_num, uniques_num = pd.factorize(numbers, sort=True)
print("\n=== Numerische Sortierkodierung ===)
print(f"Codes: {codes_num}")
print(fEindeutige Werte: {uniques_num})
Erwartete Ausgabe:
=== 原始数据 === 0 red 1 blue 2 green 3 red 4 blue 5 yellow === sort=False (默认) === 编码: [0 1 2 0 1 3] 唯一值: ['red' 'blue' 'green' 'yellow'] === sort=True (按字母顺序) === 编码: [2 0 1 2 0 3] 唯一值: ['blue' 'green', 'red', 'yellow'] 按字母顺序排列:blue, green, red, yellow - blue -> 0 - green -> 1 - red -> 2 - yellow -> 3 === 数值排序编码 === 编码: [2 0 3 2 1 0 4] 唯一值: [2, 3, 5, 8, 9] 按数值排序:2, 3, 5, 8, 9 - 2 -> 0 - 3 -> 1 - 5 -> 2 - 8 -> 3 - 9 -> 4
Code-Erklärung:
sort=TrueNach dem Sortieren der eindeutigen Werte und anschließendem Kodieren ist die Codierungsreihenfolge deterministisch und vorhersagbar.- Dies ist nützlich, wenn reproduzierbare Ergebnisse erforderlich sind.
Beispiel 3: Umgang mit fehlenden Werten
na_sentinelDer Parameter wird verwendet, um den Umgang mit fehlenden Werten zu steuern.
Beispiel
import numpy as np
Daten mit fehlenden Werten
data = pd.Series(['a', 'b', np.nan, 'a', None, 'c', 'b'])
print("=== Daten mit fehlenden Werten ===")
print(data)
# 2. Standardverhalten (fehlender Wert → -1)
codes_default, uniques_default = pd.factorize(data)
print("\n=== Standardbehandlung (fehlende Werte = -1) ===)
print(fKodierung: {codes_default})
print(f"Eindeutige Werte: {uniques_default}")
# 3. Benutzerdefinierte Kodierung fehlender Werte (Simulation von na_sentinel=-999)
codes_custom = np.where(codes_default == -1, -999, codes_default)
print("\n=== Benutzerdefinierte Kodierung fehlender Werte (-999) ===)
print(fCodes: {codes_custom})
# 4. NaN beibehalten (na_sentinel=None simulieren)
codes_nan = codes_default.astype('float')
codes_nan[codes_nan == -1] = np.nan
print("\n=== NaN beibehalten ===)
print(f"Codes: {codes_nan}")
print(f"Kodierungstyp: {type(codes_nan)
Erwartete Ausgabe:
=== 包含缺失值的数据 === 0 a 1 b 2 NaN 3 a 4 None 5 c 6 b dtype: object === 默认处理(缺失值 = -1)=== 编码: [ 0 1 -1 0 -1 2 1] 唯一值: Index(['a', 'b', 'c'], dtype='object') === 自定义缺失值编码(-999)=== 编码: [ 0 1 -999 0 -999 2 1] === 保持 NaN === 编码: [ 0. 1. nan 0. nan 2. 1.] 编码类型: <class 'numpy.float64'>
Beispiel 4: Anwendung im maschinellen Lernen
Faktorisierungskodierung ist sehr praktisch in der Vorverarbeitung für maschinelles Lernen, besonders bei kategorialen Variablen mit hoher Kardinalität.
Beispiel
Erstellen Sie ein DataFrame mit kategorialen Variablen
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Charlie', 'Diana', 'Eve', 'Frank'],
'city': ['Beijing', 'Shanghai', 'Beijing', 'Guangzhou', 'Shanghai', 'Beijing'],
'department': ['Vertrieb', 'Technik', 'Vertrieb', 'Personal', 'Technik', 'Vertrieb']
})
print("=== Ursprüngliches DataFrame ===")
print(df)
# 2. Kategorische Spalten faktorisieren
# Ein Mapping-Wörterbuch erstellen
city_codes, city_uniques = pd.factorize(df['city'])
dept_codes, dept_uniques = pd.factorize(df['department'])
print("\n=== Ergebnis der Faktorisierungskodierung ===)
print(f"Stadtcodes: {city_codes.tolist()}")
print(f"Eindeutige Werte für Stadt: {city_uniques}")
print(f"Abteilungscode: {dept_codes.tolist()}")
print(f"Eindeutige Werte für Abteilung: {dept_uniques}")
# 3. Kodierten DataFrame erstellen
df_encoded = df.copy()
df_encoded['city_encoded'] = city_codes
df_encoded['dept_encoded'] = dept_codes
print("\n=== Kodierter DataFrame ===)
print(df_encoded)
# 4. Mapping-Dictionary verwenden, um neue Daten zu kodieren
print("\n=== Mapping-Wörterbuch ===)
city_mapping = dict(zip(city_uniques, range(len(city_uniques))))
print(fStadtzuordnung: {city_mapping})
# Neue Daten kodieren
new_cities = pd.Series(['Beijing', 'Shanghai', 'Shenzhen'])
new_codes = new_cities.map(city_mapping)
print(f"\nKodierung neuer Daten: {new_codes.tolist()}")
Erwartete Ausgabe:
=== 原始 DataFrame ===
name city department
0 Alice Beijing Sales
1 Bob Shanghai Engineering
2 Charlie Beijing Sales
3 Diana Guangzhou HR
4 eve Shanghai Engineering
5 Frank Beijing Sales
=== 因子化编码结果 ===
city 编码: [0 1 0 2 1 0]
city 唯一值: ['Beijing' 'Shanghai' 'Guangzhou']
department 编码: [0 1 0 2 1 0]
department 唯一值: ['Sales' 'Engineering' 'HR']
=== 编码后的 DataFrame ===
name city department city_encoded dept_encoded
0 Alice Beijing Sales 0 0
1 Bob Shanghai Engineering 1 1
2 Charlie Beijing Sales 0 0
3 Diana Guangzhou HR 2 2
4 Eve Shanghai Engineering 1 1
5 Frank Beijing Sales 0 0
=== 映射字典 ===
city 映射: {'Beijing': 0, 'Shanghai': 1, 'Guangzhou': 2}
Code-Erklärung:
pd.factorize()Gibt ein Tupel zurück, das direkt entpackt werden kann, um die Codes und eindeutigen Werte zu erhalten.- Nach dem Erstellen eines Mapping-Wörterbuchs kann dieselbe Kodierung auf neue Daten angewendet werden, was die Modellinferenz von Machine-Learning-Modellen erleichtert.
- Die Faktorisierungskodierung erhöht die Daten-Dimension nicht und eignet sich daher für den Umgang mit kategorialen Variablen mit hoher Kardinalität.
Andere ErweiterungenTipp:
pd.factorize()Geeignet für den Umgang mit geordneten oder ungeordneten kategorialen Variablen. Wenn One-Hot-Kodierung benötigt wird (für Algorithmen wie logistische Regression), verwenden Sie bittepd.get_dummies()Funktion.
Pandas Häufige Funktionen