使用 OrdinalEnconder() 转换具有预定义数值的列

Using OrdinalEnconder() to transform columns with predefined numerical values

我有一个这样的数据框:

import pandas as pd
from sklearn.preprocessing import OrdinalEncoder

df = pd.DataFrame({'department': ['operations','operations','support','logics', 'sales'],
                   'salary': ["low", "medium", "medium", "high", "high"],
                   'tenure': [5,6,6,8,5],
                  })
df


   department  salary  tenure
0  operations     low       5
1  operations  medium       6
2     support  medium       6
3      logics    high       8
4       sales    high       5

我想将工资特征编码为 ['low', 1], ['Medium', 2], ['High', 3]。或者,['low', 0], ['Medium', 1], ['High', 2] - 不确定确切的值是否会对分类算法的进一步使用产生影响,例如作为 scikit-learn 中的逻辑回归。

但是,在应用 OrdinalEncoder() 后我没有正确订购它们 - 薪水是 'high' 我得到的是 '0' 而它应该是 '2'。

oe = OrdinalEncoder()
df[["salary"]] = oe.fit_transform(df[["salary"]])
df

    department  salary  tenure
0   operations  1.0     5
1   operations  2.0     6
2   support     2.0     6
3   logics      0.0     8
4   sales       0.0     5

我知道我可以使用 df["salary"] = df["salary"].replace(0,3) 但我希望有人可以建议更直接的方法。谢谢。

你可以留在 pandas factorize

df['new'] = df.salary.factorize()[0]
#Out[276]: array([0, 1, 1, 2, 2], dtype=int64)

正如@BENY 所说,你可以留在 pandas 做你想做的事。 factorize 如果数据中首先出现“低”,“中”第二,“高”第三(如您的示例所示),那就太好了。如果不是这样,factorize 可能无法生成您想要的结果。

一个可能的解决方案是创建一个将薪水水平映射到数字的字典并使用 map:

mapper = dict([['low', 1], ['medium', 2], ['high', 3]])
df['salary'] = df['salary'].map(mapper)

输出:

   department  salary  tenure
0  operations       1       5
1  operations       2       6
2     support       2       6
3      logics       3       8
4       sales       3       5

如果要使用OrdinalEncoder执行此操作,可以使用categories参数指定顺序。

如下:

OrdinalEncoder(categories=[['low', 'medium', 'high']]).fit_transform(df[['salary']])

输出:

array([[0.],
       [1.],
       [1.],
       [2.],
       [2.]])