)}"

Pandas 常用函数Pandas: общие функции


pd.factorize()Является функцией библиотеки Pandas, используемой длякодирования категориальных переменныхФункция преобразует категориальные данные в целочисленные коды и возвращает список уникальных значений.

Это распространённая техника в предварительной обработке машинного обучения, преобразующая текстовые категории в числовые значения, что упрощает обработку алгоритмами. По сравнению с one-hot кодированием (pd.get_dummies()), факторизационное кодирование не увеличивает размерность данных.

Определение слова: factorizeОзначает "факторизацию", здесь подразумевается преобразование категориальных переменных в числовые факторы (целочисленные коды).


Базовый синтаксис и параметры

pd.factorize()Это функция верхнего уровня библиотеки Pandas, используемая для кодирования категориальных переменных в виде целых чисел.

Формат синтаксиса

pd.factorize(values, sort=False, na_sentinel=-1, size_hint=None)

Описание параметра

  • Параметр: values
    • Тип: объект, подобный массиву, например Series, list, array и т. д.
    • Описание: категориальные данные для кодирования.
  • Параметр: sort
    • Тип: логическое значение.
    • Если он равенTrue, сортировать уникальные значения перед кодированием. По умолчанию —False(кодировать в порядке появления).
  • Параметр: na_sentinel
    • Type: Integer.
    • Integer used to mark missing values. Default is-1. If set toNone, missing values will be kept as NaN.
  • Описание функций

    • Возвращаемое значение: Возвращает кортеж (codes, uniques), где codes — закодированный целочисленный массив, а uniques — массив уникальных значений.
    • Эффект: Сопоставляет категориальные переменные с последовательностью целых чисел, начиная с 0, при этом каждому уникальному значению соответствует целое число.

    Примеры

    Давайте досконально освоим через серию примеров от простого к сложномуpd.factorize()его использование.

    Пример 1: Базовое использование — кодирование категориальных переменных

    Пример

    import pandas as pd
    import numpy as np

    # 1. Создайте категориальные данные
    colors = pd.Series(['red', 'blue', 'green', 'red', 'blue', 'yellow'])

    print("=== Исходные категориальные данные ===")
    print(colors)

    # 2. Используйте pd.factorize() для кодирования
    codes, uniques = pd.factorize(colors)

    print("\n=== результат кодирования pd.factorize() ===")
    print(fКодирование: {codes})  # Закодированное целое
    print(fУникальные значения: {uniques})  # uniqueValueList
    print(f"Тип: {type(codes)}")

    Ожидаемый вывод:

    === 原始分类数据 ===
    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']
    

    Пояснение к коду:

    1. Возвращаемый codes — это массив целых чисел, в котором каждое исходное значение заменено соответствующим целочисленным кодом.
    2. Массив uniques хранит все уникальные значения, расположенные в соответствующем порядке кодирования.
    3. По умолчанию codes присваиваются в порядке появления (первое появившееся значение кодируется как 0).

    Пример 2: параметр sort — сортировка уникальных значений перед кодированием

    Использованиеsort=Trueможно сортировать уникальные значения перед кодированием, что делает результаты более предсказуемыми.

    Пример

    import pandas as pd
    import numpy as np

    # Создание категориальных данных
    colors = pd.Series(['red', 'blue', 'green', 'red', 'blue', 'yellow'])

    print(=== Исходные данные ===)
    print(colors)

    # 1. Без сортировки (по умолчанию) — кодировать в порядке появления
    codes_unsorted, uniques_unsorted = pd.factorize(colors, sort=False)
    print("\n=== sort=False (по умолчанию) ===")
    print(f"Коды: {codes_unsorted}")
    print(fУникальные значения: {uniques_unsorted})

    # 2. Кодировать после сортировки - в алфавитном порядке
    codes_sorted, uniques_sorted = pd.factorize(colors, sort=True)
    print("\n=== sort=True (в алфавитном порядке) ===)
    print(fКоды: {codes_sorted})
    print(f"Уникальные значения: {uniques_sorted}")

    # 3. Сортировать числовые значения
    numbers = pd.Series([5, 2, 8, 5, 3, 2, 9])
    codes_num, uniques_num = pd.factorize(numbers, sort=True)
    print("\n=== Кодирование числовой сортировки ===)
    print(f"Коды: {codes_num}")
    print(fУникальные значения: {uniques_num})

    Ожидаемый вывод:

    === 原始数据 ===
    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
    

    Пояснение к коду:

    • sort=TrueПосле сортировки уникальных значений и последующего кодирования порядок кодирования детерминирован и предсказуем.
    • Это полезно, когда требуются воспроизводимые результаты.

    Пример 3: Обработка пропущенных значений

    na_sentinelПараметр используется для управления обработкой пропущенных значений.

    Пример

    import pandas as pd
    import numpy as np

    Данные, содержащие пропущенные значения
    data = pd.Series(['a', 'b', np.nan, 'a', None, 'c', 'b'])

    print("=== Данные с пропущенными значениями ===")
    print(data)

    # 2. Поведение по умолчанию (пропущенное значение → -1)
    codes_default, uniques_default = pd.factorize(data)
    print("\n=== Обработка по умолчанию (пропущенные значения = -1) ===)
    print(fКодирование: {codes_default})
    print(f"Уникальные значения: {uniques_default}")

    # 4. Пользовательское кодирование пропущенных значений (имитация na_sentinel=-999)
    codes_custom = np.where⟧codes_default(codes_default == -1, -999, codes_default)
    print("\n=== Пользовательское кодирование пропущенных значений (-) ===)
    print(fКоды: {codes_custom})

    # 4. Сохранить NaN (имитация na_sentinel=None)
    codes_nan = codes_default.astype('float')
    codes_nan[codes_nan == -1] = np.nan

    print("\n=== Сохранить NaN ===)
    print(f"Коды: {codes_nan}")
    print(f"Тип кодирования: {type(codes_nan)

    Ожидаемый вывод:

    === 包含缺失值的数据 ===
    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'>

    Пример 4: Применение в машинном обучении

    Кодирование факторизацией очень практично при предобработке в машинном обучении, особенно для категориальных переменных с высокой кардинальностью.

    Пример

    import pandas as pd

    Создайте DataFrame, содержащий категориальные переменные
    df = pd.DataFrame({
        'name': ['Alice', 'Bob', 'Charlie', 'Diana', 'Eve', 'Frank'],
        'city': ['Пекин', 'Шанхай', 'Пекин', 'Guangzhou', 'Shanghai', 'Beijing'],
        'department': ['Sales', 'Engineering', 'Sales', 'HR', 'Engineering', 'Sales']
    })

    print("=== Исходный DataFrame ===")
    print(df)

    # 2. Факторизация категориальных столбцов
    # Создайте словарь сопоставлений
    city_codes, city_uniques = pd.factorize(df['city'])
    dept_codes, dept_uniques = pd.factorize(df['department'])

    print("\n=== Результат кодирования факторизацией ===)
    print(f"коды городов: {city_codes.tolist()}")
    print(f"уникальные значения города: {city_uniques}")
    print(f"код отдела: {dept_codes.tolist()}")
    print(f"уникальные значения отдела: {dept_uniques}")

    # 3. Создание закодированного DataFrame
    df_encoded = df.copy()
    df_encoded['city_encoded'] = city_codes
    df_encoded['dept_encoded'] = dept_codes

    print("\n=== Закодированный DataFrame ===)
    print(df_encoded)

    # 4. Использование словаря сопоставления для кодирования новых данных
    print("\n=== Словарь сопоставления ===)
    city_mapping = dict(zip(city_uniques, range(len(city_uniques))))
    print(fсопоставление городов: {city_mapping})

    # Закодировать новые данные
    new_cities = pd.Series(['Beijing', 'Shanghai', 'Shenzhen'])
    new_codes = new_cities.map(city_mapping)
    print(f"\nКодирование новых данных: {new_codes.tolist()}")

    Ожидаемый вывод:

    === 原始 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}
    

    Пояснение к коду:

    • pd.factorize()Возвращает кортеж, который можно напрямую распаковать для получения кодов и уникальных значений.
    • После создания словаря сопоставления ту же кодировку можно применить к новым данным, что упрощает вывод модели машинного обучения.
    • Факторизационное кодирование не увеличивает размерность данных, что делает его подходящим для обработки категориальных переменных с высокой кардинальностью.

    Совет: pd.factorize()Подходит для обработки упорядоченных или неупорядоченных категориальных переменных. Если требуется one-hot кодирование (для таких алгоритмов, как логистическая регрессия), используйтеpd.get_dummies()функцию.

    Pandas 常用函数Pandas: общие функции

    Другие расширения