)}"

Pandas 常用函数Pandas Häufige Funktionen


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 esTrue, sortiert die eindeutigen Werte vor der Kodierung. Standard istFalse(in Reihenfolge des Auftretens kodieren).
  • Parameter: 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 pandas as pd
    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:

    1. Das zurückgegebene codes ist ein Integer-Array, wobei jeder ursprüngliche Wert durch den entsprechenden Integer-Code ersetzt wird.
    2. Das uniques-Array speichert alle eindeutigen Werte, angeordnet in der entsprechenden Reihenfolge der Kodierung.
    3. 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 pandas as pd
    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 pandas as pd
    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

    import pandas as pd

    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.

    Tipp: 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 常用函数Pandas Häufige Funktionen

    Andere Erweiterungen