Как преобразовать номинальные порядковые признаки в числовые в Python?

Что такое номинальные порядковые признаки?

Номинальные порядковые признаки — это признаки, представленные упорядоченными категориями. Например, оценка за урок может быть в виде номинальных значений: ‘отлично’, ‘хорошо’, ‘удовлетворительно’, ‘неудовлетворительно’. Если кот Матроскин получил за урок оценку ‘удовлетворительно’, а его друг Шарик — ‘отлично’, мы можем сделать вывод, что у Шарика оценка лучше, однако, это не значит, что Шарик на 2/5 или 3/4 лучше подготовился к уроку. То есть исходя из порядковых данных нельзя судить о количественных пропорциях в знаниях учеников, но можно говорить о том, что различия есть.

Другие примеры номинальных порядковых признаков: военное звание, ученая степень, всевозможные рейтинги

В рассмотренном выше примере система оценок была представлена номинальными значениями: ‘отлично’, ‘хорошо’, ‘удовлетворительно’, ‘неудовлетворительно’. Работать с такими данными не всегда удобно. Поэтому мы рассмотрим 2 способа перевода номинальных порядковых данных в числовые порядковые данные (‘неудовлетворительно’ переведем в значение 0, ‘удовлетворительно’ — в 1, ‘хорошо’ — в 2 и ‘отлично’ — в 3).

Создадим игрушечную таблицу с помощью кода:

import pandas as pd

df = pd.DataFrame({'name': ['д.Федор', 'Матроскин', 'Печкин', 
                            'Шарик', 'Галчонок'],
                   'mark': ['Отлично', 'Удовлетворительно', 'Хорошо', 
                            'Отлично', 'Неудовлетворительно'],
                   'late': [0, 0, 1, 0, 1]})

Созданный DataFrame df имеет вид:

Рассмотрим 2 способа преобразования номинальных порядковых значений колонки ‘mark’ в числовые порядковые значения:

Способ №1: преобразуем номинальные порядковые признаки в числовые с помощью метода map()

Сначала создадим словарь nums, ключами которого будут текущие значения столбца ‘mark’, а значениями — соответствующие ключам числа для замены:

nums = {'Неудовлетворительно': 0, 
        'Удовлетворительно': 1, 
        'Хорошо': 2, 'Отлично': 3}

Так как метод data.map(foo) применяет переданную ему в качестве аргумента функцию foo() ко всем элементам структуры data, то следующая конструкция позволит заменить текущие номинальные признаки в столбце ‘mark’ соответствующими им числовыми значениями из словаря nums:

data['mark'] = data['mark'].map(nums)

Полный код преобразования выглядит так:

import pandas as pd

data = pd.DataFrame({'name': ['д.Федор', 'Матроскин', 'Печкин', 'Шарик', 'Галчонок'],
        'mark': ['Отлично', 'Удовлетворительно', 'Хорошо', 'Отлично', 'Неудовлетворительно'],
        'late': [0, 0, 1, 0, 1]})

nums = {'Неудовлетворительно': 0, 
        'Удовлетворительно': 1, 
        'Хорошо': 2, 'Отлично': 3}

data['mark'] = data['mark'].map(nums)

Полученный результат:

Способ №2: преобразуем номинальные порядковые признаки в числовые с помощью OrdinalEncoder

Прежде всего импортируем OrdinalEncoder из библиотеки scikit-learn, после чего создадим список с текстовыми версиями оценок, инициируем энкодер и преобразуем данные колонки mark в цифровые:

import pandas as pd
from sklearn.preprocessing import OrdinalEncoder

data = pd.DataFrame({'name': ['д.Федор', 'Матроскин', 'Печкин', 'Шарик', 'Галчонок'],
        'mark': ['Отлично', 'Удовлетворительно', 'Хорошо', 'Отлично', 'Неудовлетворительно'],
        'late': [0, 0, 1, 0, 1]})

# Создадим список с номинальными оценками:
marks = ['Неудовлетворительно', 'Удовлетворительно', 'Хорошо', 'Отлично']

# Создадим encoder:
enc = OrdinalEncoder(categories = [marks])

# Преобразуем значения столбца 'mark':
df['mark'] = enc.fit_transform(df[['mark']])

В результате получим таблицу с категориальными числовыми данными в столбце ‘mark’:

Преобразуем номинальные порядковые признаки в числовые

Добавить комментарий