使用 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.]])
我有一个这样的数据框:
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.]])