Преобразовать категориальный столбец в конкретные целые числа

1

У меня есть несколько информационных фреймов с одним категоричным столбцом, определяющим пол (M/F). Я хочу назначить целое число 1 для мужчины и 2 для женщины. У меня есть следующий код, который cat кодирует их 0 и 1 вместо

df4["Sex"] = df4["Sex"].astype('category')
df4.dtypes
df4["Sex_cat"] = df4["Sex"].cat.codes
df4.head()  

Но мне нужно, чтобы M было 1, а F - 2. Существует ли простой способ присвоения определенных целых чисел категориям?

  • 1
    Исходя из вашего объяснения, вы можете просто добавить 1 к cat.codes . df4["Sex_cat"] = df4["Sex"].cat.codes + 1
  • 0
    @coldspeed Да, конечно.
Показать ещё 2 комментария
Теги:
pandas

3 ответа

1
Лучший ответ

IIUC:

df4['Sex'] = df4['Sex'].map({'M':1,'F':2})

И сейчас:

print(df4)

Был бы желаемый результат.

  • 1
    Для решения карты необходимо расширение для изящной обработки нескольких категорий (например, enumerate ), и astype('category') опасен, поскольку вы оставляете назначение пандам, порядок обычно лексикографический и не может контролироваться.
  • 0
    @coldspeed Да, я удалил эту часть
Показать ещё 4 комментария
0

Если вам нужно наложить определенный порядок, вы можете использовать pd.Categorical:

c = pd.Categorical(df["Sex"], categories=['M','F'], ordered=True)

Это гарантирует, что "М" будет дано наименьшее значение, "F" - следующее, и так далее. Затем вы можете просто получить доступ к codes и добавить 1.

df['Sex_cat'] = c.codes + 1

Лучше использовать pd.Categorical чем astype('category') если вы хотите более astype('category') контролировать, каким категориям назначаются какие коды.

0

Вы также можете использовать лямбду с apply:

df4['sex'] = df4['sex'].apply(lambda x : 1 if x=='M' else 2)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню