Это введение в категориальный тип данных pandas, включая краткое сравнение.
с R
.
являются типом данных pandas, соответствующим категориальным переменным в
статистика. Категориальная переменная принимает ограниченное и обычно фиксированное значение.
количество возможных значений (
;
в Р). Примеры: пол,
социальный класс, группа крови, принадлежность к стране, время наблюдения или рейтинг через
Шкалы Лайкерта.
Все значения категориальных данных находятся либо в , либо в
или
. Порядок определяется
порядок
, а не лексический порядок значений. Внутренняя структура данных
состоит из
массив и целочисленный массив
которые указывают на реальную ценность
множество.
Строковая переменная, состоящая всего из нескольких разных значений. Преобразование такой строки
переменную в категориальную переменную сэкономит немного памяти, см.
.Лексический порядок переменной не совпадает с логическим порядком («один», «два», «три»).
Путем преобразования в категориальный формат и указания порядка категорий, сортировки и
min/max будет использовать логический порядок вместо лексического, см.
.Как сигнал другим библиотекам Python о том, что этот столбец следует рассматривать как категориальный
переменная (например, для использования подходящих статистических методов или типов графиков).
См. также документацию API по категориальным критериям .
.
- Создание объекта #
- Создание серии #
- Создание DataFrame #
- Контролирующее поведение #
- Восстановление исходных данных #
- КатегориальныйDтип #
- Семантика равенства #
- Описание #
- Работа с категориями #
- Переименование категорий #
- Добавление новых категорий #
- Удаление категорий #
- Удаление неиспользуемых категорий #
- Настройка категорий #
- Сортировка и порядок #
- Изменение порядка #
- Сортировка по нескольким столбцам #
- Сравнения #
- Операции #
- d 2,0
- Средства доступа к строкам и дате и времени #
- 1 Верно 2 Верно 3 Верно
- Объединение #
- Получение/вывод данных #
- То же самое относится и к записи в базу данных SQL с помощью .
- Отличия от R #
- Попался #
- Использование памяти #
- это не массив #
- Побочные эффекты #
Создание объекта #
Создание серии #
Категоричный
или столбцы в
можно создать несколькими способами:
Указав
при построении
:
0 а 1 б 2 в 3 а
Путем преобразования существующего
или столбец в
тип d:
0 а а 1 б б 2 с с 3 а а
С помощью специальных функций, например
, который группирует данные в
дискретные бункеры. См. пример по укладке плитки .
в документах.
группа значений 0 65 60 - 69 1 49 40 - 49 2 56 50 - 59 3 43 40 - 49 4 43 40 - 49 5 91 90 - 99 6 32 30 - 39 7 87 80 - 89 8 36 30 - 39 9 8 0 - 9
Пройдя
возражать против
или присвоив его
.
0 НЭН 1 б 2 в 3 НаН А Б 0 NaN 1 б б 2 с с 3 а NaN
Категориальные данные имеют конкретный
:
Объект Категория Б
Создание DataFrame #
Как и в предыдущем разделе, где один столбец был преобразован в категориальный, все столбцы в
могут быть пакетно преобразованы в категориальные во время или после построения.
Это можно сделать во время строительства, указав
в
конструктор:
Категория А Категория Б
Обратите внимание, что категории, представленные в каждом столбце, различаются; преобразование выполняется столбец за столбцом, поэтому
только метки, присутствующие в данном столбце, являются категориями:
0 а 1 б 2 в 3 а Имя: А, тип d: категория 0 б 1 в 2 в 3 д Имя: B, dtype: категория
Аналогично все столбцы в существующем
можно пакетно преобразовать с помощью
:
Категория А Категория Б
Это преобразование также выполняется столбец за столбцом:
0 а 1 б 2 в 3 а Имя: А, тип d: категория 0 б 1 с 2 в 3 д Имя: B, dtype: категория
Контролирующее поведение #
В примерах выше, где мы передали
мы использовали значение по умолчанию
поведение:
Категории выводятся из данных.
Категории неупорядочены.
Чтобы контролировать такое поведение, вместо того, чтобы пасовать
, используйте экземпляр
из
.
0 НЭН 1 б 2 в 3 НаН
Аналогично
можно использовать с
чтобы гарантировать, что категории
согласованы между всеми столбцами.
0 а 1 б 2 в 3 а Имя: А, тип d: категория 0 б 1 с 2 в 3 д Имя: B, dtype: категория
Выполнить табличное преобразование, где все метки целиком
используются как
категории для каждого столбца
параметр может быть определен программно с помощью
.
Если у вас уже есть
и
, вы можете использовать
конструктор для сохранения шага факторизации
в обычном режиме конструктора:
Восстановление исходных данных #
Чтобы вернуться к оригиналу
или массив NumPy, используйте
или
:
0 а 1 б 2 в 3 а 0 а 1 б 2 в 3 а 0 а 1 б 2 в 3 а
В отличие от R
функция, категориальные данные не преобразуют входные значения в
струны; категории в конечном итоге будут иметь тот же тип данных, что и исходные значения.
В отличие от R
функции, в настоящее время нет возможности назначать/изменять метки в
время создания. Использовать
изменить категории после времени создания.
КатегориальныйDтип #
Тип категориала полностью описывается
: последовательность уникальных значений без пропущенных значений
: логическое значение
Эту информацию можно сохранить в
.
аргумент не является обязательным, что означает, что фактические категории
следует выводить из всего, что присутствует в данных, когда
создано. Предполагается, что категории неупорядочены.
по умолчанию.
CategoricalDtype(categories=None, order=False, категории_dtype=None)
А
можно использовать в любом месте панды
ожидает
. Например
,
, или в
конструктор.
Для удобства можно использовать строку
вместо
когда вы хотите, чтобы поведение по умолчанию
категории неупорядочены и равны установленным значениям, присутствующим в
множество. Другими словами,
эквивалентно
.
Семантика равенства #
Два экземпляра
сравнивать равные
всякий раз, когда они имеют одинаковые категории и порядок. При сравнении двух
неупорядоченные категорики, порядок
не рассматривается.
# Равно, поскольку порядок не учитывается, если order=False # Неравен, так как второй CategoricalDtype упорядочен
Все экземпляры
сравнить равно строке
.
Описание #
Использование
по категориальным данным будет производить аналогичные
выход на
или
типа
.
кот с считать 3 3 уникальный 2 2 верх к с частота 2 2 счет 3 уникальный 2 верх в частота 2 Имя: кот, тип d: объект
Работа с категориями #
Категориальные данные имеют
и
имущество, в котором перечислены их
возможные значения и имеет ли значение порядок или нет. Эти свойства
выставлено как
и
. Если вы не сделаете это вручную
укажите категории и порядок, они выводятся из переданных аргументов.
Также можно передавать категории в определенном порядке:
Новые категориальные данные: не
автоматически заказан. Вы должны явно
пройти
для обозначения заказанного
.
Результат
не всегда совпадает с
,
потому что
имеет пару гарантий, а именно, что он возвращает категории
в порядке появления и включает только те значения, которые действительно присутствуют.
0 б 1 а 2 б 3 в
Переименование категорий #
Переименование категорий осуществляется с помощью
метод:
0 а 1 б 2 в 3 а 0 Группа а 1 Группа б 2 Группа в 3 Группа А # Вы также можете передать объект, похожий на dict, для сопоставления переименования 0 Группа а 1 Группа б 2 Группа в 3 Группа а
В отличие от R
категориальные данные могут иметь категории других типов, кроме строковых.
Категории должны быть уникальными или
поднят:
ValueError: Категориальные категории должны быть уникальными
Категории также не должны быть
или
поднят:
ValueError: Категориальные категории не могут быть нулевыми
Добавление новых категорий #
Добавление категорий можно выполнить с помощью
метод:
0 Группа а 1 Группа б 2 Группа в 3 Группа А
Удаление категорий #
Удаление категорий можно выполнить с помощью
метод. Значения, которые удаляются
заменяются на
.:
0 Группа а 1 Группа б 2 Группа в 3 Группа а
Удаление неиспользуемых категорий #
Удаление неиспользуемых категорий также можно выполнить:
0 а 1 б 2 а 0 а 1 б 2 а
Настройка категорий #
Если вы хотите удалить и добавить новые категории за один шаг (который имеет некоторые
преимущество в скорости) или просто установите категории в заранее заданный масштаб,
использовать
.
0 один 1 два 2 четыре 3 - 0 один 1 два 2 четыре 3 НаН
Имейте в виду, что
не могу знать, опущена ли какая-то категория
намеренно или потому, что оно написано с ошибкой, или (в Python3) из-за разницы типов (например,
NumPy S1 dtype и строки Python). Это может привести к удивительному поведению!
Сортировка и порядок #
Если категориальные данные упорядочены (
), то порядок категорий имеет
смысл и определенные операции возможны. Если категориальное неупорядочено,
подниму
.
0 а 3 а 1 б 2 в
Вы можете упорядочить категориальные данные, используя
или отсортировать с помощью
. Это будет
по умолчанию возвращает новый
объект.
0 а 3 а 1 б 2 в 0 а 3 а 1 б 2 с
При сортировке будет использоваться порядок, определенный категориями, а не какой-либо лексический порядок, присутствующий в типе данных.
Это справедливо даже для строк и числовых данных:
0 1 1 2 2 3 3 1 1 2 2 3 0 1 3 1
Изменение порядка #
Изменение порядка категорий возможно через
и
методы. Для
, все
старые категории должны быть включены в новые категории, новые категории не допускаются. Это будет
обязательно сделайте порядок сортировки таким же, как порядок категорий.
0 1 1 2 2 3 3 1 1 2 2 3 0 1 3 1
Обратите внимание на разницу между назначением новых категорий и изменением порядка категорий: первый
переименовывает категории и, следовательно, отдельные значения в
, но если первый
позиция была отсортирована последней, переименованное значение все равно будет отсортировано последним. Изменение порядка означает, что
способ сортировки значений впоследствии изменится, но не то, что отдельные значения в
изменены.
Если
не заказан,
и
поднимет
. Числовые операции, такие как
,
,
,
и операции на их основе
(например,
, которому нужно будет вычислить среднее между двумя значениями, если длина
массива четный) не работает и поднимает
.
Сортировка по нескольким столбцам #
Столбец с категориальным типом будет участвовать в сортировке по нескольким столбцам так же, как и другие столбцы.
Порядок категориальных определяется
этого столбца.
2 е 1 3 е 2 7 а 1 6 а 2 0 б 1 5 б 1 1 б 2 4 б 2
Изменение порядка
меняет будущую сортировку.
7 а 1 6 а 2 0 б 1 5 б 1 1 б 2 4 б 2 2 е 1 3 е 2
Сравнения #
Сравнение категориальных данных с другими объектами возможно в трёх случаях:
Все сравнения (
,
,
,
,
, и
) категориальных данных
еще одна категориальная серия, когда
и
одинаковы.Все сравнения категориальных данных со скаляром.
Все остальные сравнения, особенно сравнения «неравенства» двух категориальных с разными
категории или категориальное выражение с любым объектом, похожим на список, вызовет
.
Любые сравнения категориальных данных с «неравенством» с
,
,
или
категориальные данные с разными категориями или порядком повысят
потому что обычай
Упорядочение категорий можно интерпретировать двояко: с учетом
под заказ и один без.
0 1 1 2 2 3 0 2 1 2 2 2 0 2 1 2 2 2
Сравнение с категориальным с теми же категориями и порядком или со скалярным произведением:
0 Верно 1 Ложь 2 Ложь 0 Верно 1 Ложь 2 Ложь
Сравнение на равенство работает с любым спискомобразным объектом одинаковой длины и скаляров:
0 Ложь 1 Верно 2 Ложь 0 Верно 1 Верно 2 Верно 0 Ложь 1 Верно 2 Ложь
Это не работает, потому что категории не одинаковы:
Ошибка типа: категориальные значения можно сравнивать только в том случае, если «категории» одинаковы.
Если вы хотите выполнить сравнение «неравенства» категориального ряда с объектом в виде списка
которые не являются категориальными данными, вам необходимо указать явно и преобразовать категориальные данные обратно в
исходные значения:
Ошибка типа: невозможно сравнить категориальное значение для op __gt__ с типом Если вы хотите сравнить значения, используйте «np.asarray(cat) other».
Когда вы сравниваете две неупорядоченные категориальные категории с одинаковыми категориями, порядок не учитывается:
Операции #
такие методы, как
будут использовать все категории,
даже если некоторые категории отсутствуют в данных:
с 2
а 1
d 0
Имя: count, dtype: int64
такие методы, как
также показывать «неиспользуемые» категории, когда
.
Один 3 9
Два 3 6
Три 0 0
Groupby также покажет «неиспользуемые» категории, когда
:
а 1,0
б 2,0
c 4,0
d NaN
d 2,0
б в 3,0
d 4,0
c c NaN
а с 1,0 d 2,0 б в 3,0 d 4,0
Обработка данных #
Оптимизированные методы доступа к данным Pandas
,
,
, и
,
работать как обычно. Единственная разница — это тип возвращаемого значения (для получения) и
это только значения уже в
можно назначить.
Получение #
Если операция нарезки возвращает либо
или столбец типа
,
dtype сохраняется.
значения кошек j б 2 к б 2 категория кошек значения int64 ч а и б дж б Имя: кошки, dtype: категория ценности кошек и б 2 j б 2 к б 2
Примером того, где тип категории не сохраняется, является случай, когда вы берете один единственный
ряд: полученный
имеет dтип
:
# получить всю строку «h» как серию кошки а значения 1 Имя: h, dтип: объект
Возврат одного элемента из категориальных данных также вернет значение, а не категориальное значение.
длины «1».
# возвращает строку
Чтобы получить одно значение
типа
, вы передаете список с
одно значение:
высота х Имя: кошки, тип d: категория
Средства доступа к строкам и дате и времени #
Аксессуары
и
будет работать, если
являются из
соответствующий тип:
0 а 1 а 2 б 3 б 0 Верно 1 Верно 2 Ложь 3 Ложь 0 01.01.2015 1 02.01.2015 2 03.01.2015 3 04.01.2015 4 05.01.2015 0 1 1 2 2 3 3 4 4 5
Возвращенный
(или
) имеет тот же тип, как если бы вы использовали
/
на
такого типа (а не
тип
!).
Это означает, что возвращаемые значения методов и свойств методов доступа
и возвращаемые значения методов и свойств средств доступа этого
преобразован в один из типов
будет равно:
0 Верно
1 Верно
2 Верно
3 Верно
Работа выполнена на
а потом новый
построен. Это имеет
некоторые последствия для производительности, если у вас есть
типа string, где много элементов
повторяются (т.е. количество уникальных элементов в
намного меньше, чем
длина
). В этом случае конвертировать оригинал можно быстрее.
к одному из типов
и использовать
или
на том.
Настройка
#
Установка значений в категориальном столбце (или
) работает до тех пор, пока
значение включено в
:
значения кошек
ч а 1
и 1
j б 2
к б 2
л а 1
м а 1
н а 1
Ошибка типа: невозможно установить элемент в категориальный элемент с новой категорией, сначала установите категории
Установка значений путем присвоения категориальных данных также проверяет, что
совпадение:
значения кошек
ч а 1 и 1
и 2
к а 2
л а 1
м а 1 н а 1
Ошибка типа: невозможно установить категорию с другой, без идентичных категорий
Присвоение
к частям столбца других типов будут использоваться значения:
0 1 а
1 б а
2 б б
3 1 б
4 1 а
предмет
б объект
Слияние/конкатенация #
По умолчанию объединение
или
которые содержат одно и то же
категории приводят к
dtype, иначе результаты будут зависеть от
dtype базовых категорий. Слияния, которые приводят к некатегориальным
dtypes, скорее всего, будут использовать больше памяти. Использовать
или
чтобы обеспечить
Результаты.
# те же категории
0 а
1 б
0 а
1 б
2 а
# разные категории
0 а
1 б
0 б
1 с
# Выходной тип dtype выводится на основе значений категорий
0 1,0
1 2,0
0 3,0
1 4,0
0 а
1 б
0 б
1 с
Объединение #
Если вы хотите объединить категорики, которые не обязательно имеют одно и то же
категории,
функция будет
объединить список категориальных категорий. Новые категории будут представлять собой объединение
категории, которые объединяются.
По умолчанию полученные категории будут упорядочены следующим образом:
они появляются в данных. Если вы хотите, чтобы категории
быть лекссортированным, использовать
аргумент.
также работает с «простым» случаем объединения двух
категорики тех же категорий и информация о заказе
(например, то, что вы могли бы также
для).
Ниже поднимается
потому что категории упорядочены и не идентичны.
Traceback (последний вызов — последний)
в (to_union, sort_categories, ignore_order)
«чтобы объединить упорядоченные категорики, все категории должны быть одинаковыми»
«Категорический.упорядоченный должен быть одинаковым»
: для объединения упорядоченных категорий все категории должны быть одинаковыми.
Упорядоченные категориальные элементы с разными категориями или порядком можно комбинировать с помощью
используя
аргумент.
также работает с
, или
содержащие категориальные данные, но обратите внимание, что
результирующий массив всегда будет простым
:
может перекодировать целочисленные коды для категорий
при объединении категориальных. Вероятно, это то, что вы хотите,
но если вы полагаетесь на точную нумерацию категорий, будьте
осведомленный.
# «b» кодируется как 0
# «b» кодируется как 1
# «b» везде кодируется как 0, так же, как и c1, но отличается от c2
Получение/вывод данных #
Вы можете записать данные, содержащие
dtypes до
.
См.
для примера и предостережений.
Также возможно записывать и читать данные из Stata
форматировать файлы.
См.
для примера и предостережений.
Запись в файл CSV преобразует данные, эффективно удаляя любую информацию о
категориальный (категории и упорядочивание). Итак, если вы прочитаете файл CSV, вам придется преобразовать
соответствующие столбцы вернуться к
и назначьте правильные категории и порядок категорий.
# переименовываем категории
# изменить порядок категорий и добавить недостающие категории
Безымянный: 0 int64
коты объект
vals int64
0 очень хорошо
1 товар
2 хорошо
3 очень хорошо
4 очень хорошо
5 плохих
Имя: кошки, тип d: объект
# Повторить категорию Безымянный: 0 int64
категория кошек
vals int64
0 очень хорошо
1 товар
2 хорошо
3 очень хорошо
4 очень хорошо
5 плохих
Имя: кошки, тип d: категория То же самое относится и к записи в базу данных SQL с помощью
.
Отсутствующие данные #
pandas в основном использует значение для представления недостающих данных. Это по
по умолчанию не учитывается в вычислениях. См. раздел «Отсутствующие данные» .
.
Отсутствующие значения должны , а не
быть включенным в Категориальные
,
только в
.
Вместо этого понятно, что NaN отличается и всегда возможен.
При работе с Категориальными
, пропущенные значения всегда будут иметь
код
.
# только две категории
0 а
1 б
2 НаН
3 а
0 0
1 1
2 -1
3 0
Методы работы с недостающими данными, напр.
,
,
, все работает нормально:
0 а
1 б
2 НаН
0 Ложь
1 Ложь
2 Верно
0 а
1 б
2 а
Отличия от R
#
Р
названы
.
Р
всегда имеют строковый тип, а
в пандах может быть любого типа.
Невозможно указать метки во время создания. Использовать
после.
В отличие от R
функция, использующая категориальные данные в качестве единственного входного параметра для создания
новый категориальный ряд будет не
удалить неиспользуемые категории, но создать новую категориальную серию
что равно переданному за один!
R позволяет включать пропущенные значения в свой
(панды
). панды
не позволяет
категории, но пропущенные значения все равно могут находиться в
.
Попался #
Использование памяти #
Использование памяти
пропорционально количеству категорий плюс длине данных. В отличие,
ан
dtype — это константа, умноженная на длину данных.
# тип объекта
# категория dтип
Если количество категорий приближается к длине данных,
будет использовать почти то же самое или
больше памяти, чем эквивалент
представление dtype.
# тип объекта
# категория dтип
это не
массив #
В настоящее время категориальные данные и лежащие в их основе
реализован как Python
объект, а не как низкоуровневый массив NumPy dtype. Это приводит к некоторым проблемам.
Сам NumPy о новом не знает
:
TypeError: тип данных «категория» не понятен
Сравнение D-типов работает:
Чтобы проверить, содержит ли серия категориальные данные, используйте
:
Использование функций NumPy на
типа
не должно работать как
не являются числовыми данными (даже в том случае, если
числовое).
TypeError: «Категорический» с категорией dtype не поддерживает сокращение «суммы»
dtype в применении
#
pandas в настоящее время не сохраняет dtype в функциях применения: если вы применяете вдоль строк, вы получаете
а
из
(то же самое, что получение строки -> получение одного элемента вернет
базовый тип) и применение вдоль столбцов также преобразуется в объект.
ценности не затронуты.
Вы можете использовать
для обработки пропущенных значений перед применением функции.
0
1
2
3 int64
б объект
категория кошек
Категориальный индекс #
это тип индекса, который полезен для поддержки
индексация с дубликатами. Это контейнер вокруг
и позволяет эффективно индексировать и хранить индекс с большим количеством повторяющихся элементов.
См. документацию по расширенному индексированию .
для более подробного
объяснение.
Установка индекса создаст
:
# Теперь сортируется по порядку категорий
строковые значения
4 д 1
2 б 2
3 с 3
1 а 4
Побочные эффекты #
Построение
от
не будет копировать ввод
. Это означает, что изменения на
будет в большинстве случаев
изменить оригинал
:
Использовать
чтобы предотвратить такое поведение или просто не использовать повторно
:
Мне нужна помощь в понимании этой строки кода:
y_train2 = train_target2.astype('category').cat.codes
Прав ли я, говоря это y_train2
заменяется на категориальную переменную с помощью astype(category)
а потом cat.codes
используется для преобразования его в целые числа?
# Train data pre-processing
train_target2 = df_train_01['class_2']
train_target5 = df_train_01['class_5']
df_train_02.drop(['class_2', 'class_5'], axis=1, inplace=True)
# convert text labels to integers
y_train2 = train_target2.astype('category').cat.codes
y_train5 = train_target5.astype('category').cat.codes
# Test data pre-processing
test_target2 = df_test_01['class_2']
test_target5 = df_test_01['class_5']
# drop 'class_2' and 'class_5' columns
df_test_02.drop(['class_2', 'class_5'], axis=1, inplace=True)
y_test2 = test_target2.astype('category').cat.codes
y_test5 = test_target5.astype('category').cat.codes

5 золотых значков
39 серебряных знаков
78 бронзовых знаков
спросил 5 апр. 2021 в 17:45

Я думаю, что вы правильно понимаете функцию и атрибут фрейма данных; pdf.astype(‘category’) преобразует значения в категориальные данные и PDF. Categorical.codes() (или pdf. Series.codes() ) — это атрибут, который преобразует значения в набор целых чисел, начинающихся с 0.
Попробуйте ввести какой-нибудь простой фрагмент ниже, чтобы увидеть, как они работают.
from sklearn.datasets import load_iris
import pandas as pd
import numpy as np
iris = load_iris()
pdf = pd.DataFrame(iris.data, columns=['s-length', 's-width', 'p-length', 'p-width'])
print(
iris['s-length'].astype('category'),
len(np.unique(iris['s-length'])), # -> 35
len( set(iris['s-length'].astype('category').cat.codes ), # -> 35
np.unique(iris['s-length'].astype('category').cat.codes)), # -> array([ 0, 1,...34]), dtype=int8)
)
ответ дан 5 апр. 2021 в 18:37

6 серебряных знаков
17 бронзовых знаков
По сути, категориальный тип данных pandas представляет собой сопоставление между значениями, которые не имеют числовой интерпретации и уникального номера для каждого значения.
Давайте разберем ваш код:
# Take the series `train_target2` and convert it to categorical type
train_target2.astype('category')
# Access the attributes or methods of a categorical series
train_target2.astype('category').cat
# Take the `codes` attribute
train_target2.astype('category').cat.codes
На самом деле .codes
не преобразует данные в числа. Скорее, вы берете только числовой эквивалент каждой категории. Строго говоря, .astype('category')
— это часть, которая преобразовала ваши данные в категориальные.
Вы можете найти атрибуты и методы этого типа данных здесь
.
ответ дан 5 апр 2021 в 19:17

Артуро Сбр
5 золотых значков
39 серебряных знаков
78 бронзовых знаков
У меня есть фрейм данных с данными такого типа (слишком много столбцов):
col1 int64
col2 int64
col3 category
col4 category
col5 category
Столбцы выглядят так:
Name: col3, dtype: category
Categories (8, object): [B, C, E, G, H, N, S, W]
Я хочу преобразовать все значения в каждом столбце в целые числа следующим образом:
[1, 2, 3, 4, 5, 6, 7, 8]
Я решил это для одного столбца следующим образом:
dataframe['c'] = pandas.Categorical.from_array(dataframe.col3).codes
Теперь у меня есть два столбца в моем фрейме данных — старый col3
и новый c
и нужно удалить старые столбцы.
Это плохая практика. Это работает, но в моем фрейме данных слишком много столбцов, и я не хочу делать это вручную.
Как мне сделать это умнее?
спросил 14 авг. 2015 в 13:31

Сначала создаём пример фрейма данных:
In [75]: df = pd.DataFrame({'col1':[1,2,3,4,5], 'col2':list('abcab'), 'col3':list('ababb')})
In [76]: df['col2'] = df['col2'].astype('category')
In [77]: df['col3'] = df['col3'].astype('category')
In [78]: df.dtypes
Out[78]:
col1 int64
col2 category
col3 category
dtype: object
In [80]: cat_columns = df.select_dtypes(['category']).columns
In [81]: cat_columns
Out[81]: Index([u'col2', u'col3'], dtype='object')
In [83]: df[cat_columns] = df[cat_columns].apply(lambda x: x.cat.codes)
In [84]: df
Out[84]:
col1 col2 col3
0 1 0 0
1 2 1 1
2 3 2 0
3 4 0 1
4 5 1 1
- NaN становится -1
- Этот метод является быстрым, поскольку взаимосвязь между кодом и категорией легко доступна и ее не нужно вычислять.

ответ дан 14 авг 2015 в 14:01

Меня это устраивает:
pandas.factorize( ['B', 'C', 'D', 'B'] )[0]
[0, 1, 2, 0]
ответил 12 сен 2017 в 23:20

8 золотых значков
53 серебряных знака
71 бронзовый знак
Если вас беспокоило только то, что вы создали дополнительный столбец и удалили его позже, просто не используйте сначала новый столбец.
dataframe = pd.DataFrame({'col1':[1,2,3,4,5], 'col2':list('abcab'), 'col3':list('ababb')})
dataframe.col3 = pd.Categorical.from_array(dataframe.col3).codes
Всё готово. Теперь как Categorical.from_array
устарел, используйте Categorical
напрямую
dataframe.col3 = pd.Categorical(dataframe.col3).codes
Если вам также нужно обратное сопоставление индекса с меткой, есть еще лучший способ для этого
dataframe.col3, mapping_index = pd.Series(dataframe.col3).factorize()
print(dataframe)
print(mapping_index.get_loc("c"))
ответ дан 27 мая 2017 в 5:56

4 золотых значка
32 серебряных знака
51 бронзовый знак
Здесь необходимо преобразовать несколько столбцов. Итак, один из подходов, который я использовал, — это .
for col_name in df.columns:
if(df[col_name].dtype == 'object'):
df[col_name]= df[col_name].astype('category')
df[col_name] = df[col_name].cat.codes
При этом все столбцы строковых/объектных типов преобразуются в категориальные. Затем применяет коды к каждому типу категории.
ответ дан 15 фев 2018 в 6:07

Что я делаю, я replace
ценности.
df['col'].replace(to_replace=['category_1', 'category_2', 'category_3'], value=[1, 2, 3], inplace=True)
Таким образом, если col
столбец имеет категориальные значения, они заменяются числовыми значениями.
ответ дан 6 июля 2020 г. в 10:32

3 серебряных значка
14 бронзовых знаков
from sklearn.preprocessing import LabelEncoder
labelencoder= LabelEncoder() #initializing an object of class LabelEncoder
data['C'] = labelencoder.fit_transform(data['C']) #fitting and transforming the desired categorical column.
ответ дан 9 янв. 2020 в 6:52

Чтобы преобразовать все столбцы в Dataframe в числовые данные:
df2 = df2.apply(lambda x: pd.factorize(x)[0])
ответ дан 17 марта 2021 в 16:23

Ответы здесь кажутся устаревшими. У Панд теперь есть factorize()
функция, и вы можете создавать категории как:
df.col.factorize()
pandas.factorize(values, sort=False, na_sentinel=- 1, size_hint=None)
ответ дан 5 дек 2020 в 0:03

3 золотых значка
31 серебряный знак
46 бронзовых знаков
df['col3']=df['col3'].replace(['B', 'C', 'E', 'G', 'H', 'N', 'S', 'W'],[1,2,3,4,5,6,7,8])
df['col3']=df['col3'].map({1: 'B', 2: 'C', 3: 'E', 4:'G', 5:'H', 6:'N', 7:'S', 8:'W'})
ответ дан 31 дек 2021 в 11:16

Один из самых простых способов преобразовать категориальную переменную в фиктивные/индикаторные переменные – использовать get_dummies
предоставлено пандами.
Скажем, например, у нас есть данные, в которых sex
категориальное значение (мужской и женский)
и вам нужно преобразовать его в манекен/индикатор, вот как это сделать.
tranning_data = pd.read_csv("../titanic/train.csv")
features = ["Age", "Sex", ] //here sex is catagorical value
X_train = pd.get_dummies(tranning_data[features])
print(X_train)
Age Sex_female Sex_male
20 0 1
33 1 0
40 1 0
22 1 0
54 0 1
ответ дан 28 сен 2020 в 8:46

Хади Мир
2 золотых значка
29 серебряных знаков
32 бронзовых знака
categorical_columns =['sex','class','deck','alone']
for column in categorical_columns:
df[column] = pd.factorize(df[column])[0]
Факторизация преобразует каждые уникальные категориальные данные в столбце в определенное число (от 0 до бесконечности).
ответ дан 6 янв. 2022 в 20:01

dataset=pd.read_csv('Data2.csv')
np.set_printoptions(threshold=np.nan)
X = dataset.iloc[:,:].values
from sklearn.preprocessing import LabelEncoder
labelencoder_X=LabelEncoder()
X[:,0] = labelencoder_X.fit_transform(X[:,0])

11 золотых знаков
43 серебряных знака
52 бронзовых знака
ответил 30 июля 2017 в 22:19

Вы можете сделать это без кода, как показано ниже:
f = pd.DataFrame({'col1':[1,2,3,4,5], 'col2':list('abcab'),'col3':list('ababb')})
f['col1'] =f['col1'].astype('category').cat.codes
f['col2'] =f['col2'].astype('category').cat.codes
f['col3'] =f['col3'].astype('category').cat.codes
f

ответ дан 17 окт. 2020 в 4:14

3 серебряных значка
6 бронзовых знаков
Просто используйте сопоставление вручную:
dict = {'Non-Travel':0, 'Travel_Rarely':1, 'Travel_Frequently':2}
df['BusinessTravel'] = df['BusinessTravel'].apply(lambda x: dict.get(x))

ответ дан 16 янв. 2022 в 12:03

Для определенного столбца, если вас не волнует порядок, используйте это
df['col1_num'] = df['col1'].apply(lambda x: np.where(df['col1'].unique()==x)[0][0])
Если вас волнует порядок, укажите их в виде списка и используйте это
df['col1_num'] = df['col1'].apply(lambda x: ['first', 'second', 'third'].index(x))
ответ дан 27 мар 2020 в 19:53

2 золотых значка
14 серебряных знаков
26 бронзовых знаков
вы можете использовать что-то вроде этого
df['Grade'].replace(['A', 'B', 'C'], [0, 1, 2], inplace=True)
используйте аргумент inplace, если так, чтобы не выполнять копирование. вы выбираете столбец и заменяете там отдельный столбец тем, который вам нужен.
ответ дан 4 апр в 22:52

6 серебряных знаков
18 бронзовых знаков
