У меня есть несколько информационных фреймов с одним категоричным столбцом, определяющим пол (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. Существует ли простой способ присвоения определенных целых чисел категориям?
IIUC:
df4['Sex'] = df4['Sex'].map({'M':1,'F':2})
И сейчас:
print(df4)
Был бы желаемый результат.
enumerate
), и astype('category')
опасен, поскольку вы оставляете назначение пандам, порядок обычно лексикографический и не может контролироваться.
Если вам нужно наложить определенный порядок, вы можете использовать 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')
контролировать, каким категориям назначаются какие коды.
Вы также можете использовать лямбду с apply:
df4['sex'] = df4['sex'].apply(lambda x : 1 if x=='M' else 2)
1
кcat.codes
.df4["Sex_cat"] = df4["Sex"].cat.codes + 1