类别型特征转换为数值型特征--字典映射

今天见到了一种将类别型转换为数值型的字典映射方法,记录一下。
数据集用的是Titanic数据集,可以从kaggle上下载到。

import pandas as pd
import numpy as np

data = pd.read_csv('Titanic.csv')
data.Embarked.value_counts()

ordinal_label = {k: i for i, k in enumerate(data['Embarked'].unique(), 0)}
data['Embarked'] = data['Embarked'].map(ordinal_label)

data.Embarked.value_counts()

看一下输出,便于理解:

# 原始data
data.Embarked.value_counts()
# output 
S    644
C    168
Q     77
Name: Embarked, dtype: int64

ordinal_label
# output
{'S': 0, 'C': 1, 'Q': 2, nan: 3}

# 变换之后的data
data.Embarked.value_counts()
# output
0    644
1    168
2     77
3      2
Name: Embarked, dtype: int64

这个转换主要是利用enumerate() 和 map() 两个函数完成的。

enumerate(iterable, start=0)Source
返回一个枚举对象。iterable 必须是一个序列,或 iterator,或其他支持迭代的对象。 enumerate() 返回的迭代器的 next() 方法返回一个元组,里面包含一个计数值(从 start 开始,默认为 0)和通过迭代 iterable 获得的值。

Series.map(self, arg, na_action=None)Source
根据输入对应关系映射Series的值。
用于将系列中的每个值替换为可以从函数,字典或系列中得出的另一个值。

所以是利用enumerate返回Embarked列和从0开始编号组合的一个元组,然后把元组读出转化为字典,元素和序号一一对应。然后用map函数将这个映射关系用到整列。

另外,对于类别比较少的类别型列,可以直接用 np. where()实现。例如Sex列:

data['Sex'] = np.where(data.Sex == 'male', 1, 0)
data['Sex'].value_counts()

# output
1    577
0    314
Name: Sex, dtype: int64

你可能感兴趣的:(类别型特征转换为数值型特征--字典映射)