一、字典的简单介绍
字典(dict):{ }
通过 key 找到是相关联的另一个数据 value ,由一个个 键值对 组成
# 定义字典
my_dict = {"周杰伦":99, "张三":90, "阿里":89}
# 定义空字典
my_dict_empty = {}
my_dict_empty = dict()
# 定义重复key的字典(不允许重复,重复相当于覆盖)
my_dict = {"周杰伦":100, "周杰伦":90, "阿里":89}
print(my_dict) # 输出:{"周杰伦":90, "阿里":89}
# 从字典中基于key获取value 无索引0 1 2...
my_dict = {"周杰伦":99, "张三":90, "阿里":89}
score = my_dict["张三"]
print(score) # 输出:90
# 定义嵌套字典 key不能为字典
stu_score_dict = {
'王力宏': {
'语文': 77,
'数学': 66,
'英语': 33
},
'周杰伦': {
'语文': 88,
'数学': 86,
'英语': 55
},
'林俊杰': {
'语文': 95,
'数学': 85,
'英语': 76
}
}
print(f'学生的考试信息为:{stu_score_dict}')
# 从嵌套字典中获取数据
score1 = stu_score_dict['王力宏']['数学']
print(f'王力宏的数学成绩为:{score1}')
字典常用操作:
# 新增和修改 key不存在时为新增,key存在时为修改
字典[key] = value
# 删除 传入一个key,能取到对应的value,同时删除key和value
字典.pop[key]
# 清空
字典.clear()
# 获取全部的key 用来遍历 字典.keys()
my_dict = {"周杰伦":99, "周杰伦":90, "阿里":89}
keys = my_dict.keys()
print(keys) # 输出:dict_keys(['周杰伦', '王力宏', '阿里'])
# 遍历字典
for key in keys:
value = my_dict[key]
print(f'{key}的value值为:{value}')
# 或者
for key in my_dict:
value = my_dict[key]
print(f'{key}的value值为:{value}')
"""
输出:
周杰伦的value值为:99
王力宏的value值为:90
阿里的value值为:89
"""
# 统计字典内元素数量
count = len(my_dict)
编号 | 操作 | 说明 |
---|---|---|
1 | 字典[Key] | 获取指定Key对应的Value值 |
2 | 字典[Key] = Value | 添加或更新键值对 |
3 | 字典.pop(Key) | 取出Key对应的Value并在字典内删除此Key的键值对 |
4 | 字典.clear() | 清空字典 |
5 | 字典.keys() | 获取字典的全部Key,可用于for循环遍历字典 |
6 | len(字典) | 计算字典内的元素数量 |
读取数据
import pandas as pd
dt = pd.read_csv('data.csv')
二、标签编码
- 对离散特征的处理中
- 前边学习了对没有顺序和大小关系的离散特征进行独热编码,借助pd.get_dummies()方法
- 今天学习对有顺序和大小关系的离散特征进行标签编码,借助dataframe的map()函数
- 标签编码:为离散特征的每个不同取值分配一个唯一的整数。
- 例如:动物特征下有 3 个取值:猫、狗、马,我们可以将其编码为 0、1、2。
1、对Home Ownership特征进行标签编码:
这里对Home Ownership进行标签编码,实际上也可以对它进行独热编码,最终模型效果哪种好保留哪个
# 查看特征Home Ownership的前五行
dt['Home Ownership'].head()
输出:
0 Own Home
1 Own Home
2 Home Mortgage
3 Own Home
4 Rent
Name: Home Ownership, dtype: object
# 查看特征下各类别出现的次数
dt['Home Ownership'].value_counts()
输出:
Home Ownership
Home Mortgage 3637
Rent 3204
Own Home 647
Have Mortgage 12
Name: count, dtype: int64
- Home Mortgage 有房贷
- Rent 租房
- Own Home 拥有自有住房,无贷款
- Have Mortgage 无房贷,有其他贷款
- 按照贷款风险程度(抗风险能力)依次是:自有住房<租房<有其他贷款<有房贷
1.定义映射字典
# 定义映射字典mapping
mapping = {
'Home Mortgage': 3,
'Rent': 1,
'Own Home': 0,
'Have Mortgage': 2
}
2.进行映射
dt['Home Ownership'] = dt['Home Ownership'].map(mapping)
dt['Home Ownership'].head()
输出映射后前5行:
0 0
1 0
2 3
3 0
4 1
Name: Home Ownership, dtype: int64
原来为:
0 Own Home
1 Own Home
2 Home Mortgage
3 Own Home
4 Rent
Name: Home Ownership, dtype: object
类型是字符串时,也需要映射成整数类型,这里不要理解成独热编码或者标签编码
二分类问题不需要进行独热编码:
例如 性别 特征,分类有男和女,不需要编码成 性别_男 和 性别_女 两个特征,如果编码成两个特征那么 性别_男=1 就说明 性别_女 必定等于0,这样两个特征具有很强的相关性。
性别_男=1的含义是:性别是男;性别_男=0的含义是:性别不是男。
三分类问题及以上才需要才涉及独热编码
2、对Term特征进行标签编码:
# 查看Term特征下的类别有哪些
dt['Term'].value_counts()
输出:
Term
Short Term 5556
Long Term 1944
Name: count, dtype: int64
1.映射字典和映射
# 定义映射字典
mapping = {
'Short Term': 0,
'Long Term':1
}
# map方法进行映射
dt['Term'] = dt['Term'].map(mapping)
dt['Term'].head()
输出:
0 0
1 1
2 0
3 0
4 0
Name: Term, dtype: int64
3、嵌套字典进行映射
实际上,可以调用一次函数实现上述两次标签编码,因为字典可以嵌套
import pandas as pd
dt = pd.read_csv('data.csv')
# 定义映射字典
mapping = {
'Home Ownership' :{
'Home Mortgage': 3,
'Rent': 1,
'Own Home': 0,
'Have Mortgage': 2
},
'Term' :{
'Short Term': 0,
'Long Term':1
}
}
mapping['Term'] # 访问嵌套字典的值,此时又是一个字典
输出:
{'Short Term': 0, 'Long Term': 1}
分别对Home Ownership 和 Term 进行映射:
# 对Home Ownership进行映射
dt['Home Ownership'] = dt['Home Ownership'].map(mapping['Home Ownership'])
# 对Term进行映射
dt['Term'] = dt['Term'].map(mapping['Term'])
dt.head()
三、连续变量的处理
归一化和标准化可以通过 手写函数 实现,也可以通过 sklearn库 中的函数实现
1、手动构建函数
# 对列Annual Income做归一化,手动构建函数实现
def manual_normalize(data):
"""
此函数用于对数据的数据进行归一化
:param data:输入的一维数据(如 Pandas 的 Series)
:return:归一化后的数据
"""
min_val = data.min()
max_val = data.max()
normalized_data = (data - min_val) / (max_val - min_val)
return normalized_data
# 对列Annual Income做归一化
dt['Annual Income'] = manual_normalize(dt['Annual Income'])
# 查看归一化后的 年收入
dt['Annual Income']
输出:
0 0.031798
1 0.086221
2 0.058771
3 0.064145
4 0.061260
...
7495 0.023796
7496 0.137148
7497 0.171693
7498 NaN
7499 NaN
Name: Annual Income, Length: 7500, dtype: float64
2、借助sklearn库进行归一化:
# 借助sklearn库进行归一化
from sklearn.preprocessing import StandardScaler, MinMaxScaler
dt = pd.read_csv('data.csv')
# 归一化处理
min_max_scaler = MinMaxScaler() # 实例化 MinMaxScaler类,采用这种导入函数的方式,不需要申明库名
# 将结果覆盖原列
dt['Annual Income'] = min_max_scaler.fit_transform(dt[['Annual Income']])
dt['Annual Income'].head()
输出:
0 0.031798
1 0.086221
2 0.058771
3 0.064145
4 0.061260
Name: Annual Income, dtype: float64
注:
1、 使用 “from 模块名 import 类、变量、方法” 导入,使用时无需再写库明,例如sklearn.preprocessing.MinMaxScaler
2、dt['Annual Income'] = min_max_scaler.fit_transform(dt[['Annual Income']])
作用:对 dt 中的 'Annual Income' (年收入)列进行归一化处理,并将结果覆盖原列。
fit_transform 是 MinMaxScaler 的核心方法,包含两步操作:
(1)fit :计算该列数据的最小值( min )和最大值( max ),保存为 min_max_scaler 实例的内部属性。
(2)transform :根据公式 (X - X.min()) / (X.max() - X.min()) ,将数据缩放到 [0,1] 区间。
3、 dt[['Annual Income']] 是取列的二维形式(DataFrame),因为 fit_transform 要求输入为二维数组。
3、借助sklearn库进行标准化:
# 标准化
dt = pd.read_csv('data.csv')
scaler = StandardScaler() # 实例化
dt['Annual Income'] = scaler.fit_transform(dt[['Annual Income']])
dt['Annual Income'].head()
输出:
0 -1.046183
1 -0.403310
2 -0.727556
3 -0.664078
4 -0.698155
Name: Annual Income, dtype: float64
注:
Home Ownership下的类别明明是str类型,为什么显示为object(对象)类型?
dtype: object 表示该列(Series)的数据类型为 对象类型 (object type),通常用于存储 混合类型数据 或 字符串数据 。
dtype: object 是 pandas 对“无法归类为数值/布尔等基础类型”的列的通用标识,最常见于存储文本或混合类型的数据。
四、对心脏病数据集中连续特征进行处理
import pandas as pd
from sklearn.preprocessing import StandardScaler, MinMaxScaler
# 读取数据
dt = pd.read_csv('heart.csv')
# 原名不容易理解,换个名
dt.columns = ['age',
'sex',
'chest_pain_type',
'resting_blood_pressure',
'cholesterol',
'fasting_blood_sugar',
'rest_ecg',
'max_heart_rate_achieved',
'exercise_induced_angina',
'st_depression',
'st_slope',
'num_major_vessels',
'thalassemia', 'target']
dt.head()
age | sex | chest_pain_type | resting_blood_pressure | cholesterol | fasting_blood_sugar | rest_ecg | max_heart_rate_achieved | exercise_induced_angina | st_depression | st_slope | num_major_vessels | thalassemia | target | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 63 | 1 | 3 | 145 | 233 | 1 | 0 | 150 | 0 | 2.3 | 0 | 0 | 1 | 1 |
1 | 37 | 1 | 2 | 130 | 250 | 0 | 1 | 187 | 0 | 3.5 | 0 | 0 | 2 | 1 |
2 | 41 | 0 | 1 | 130 | 204 | 0 | 0 | 172 | 0 | 1.4 | 2 | 0 | 2 | 1 |
3 | 56 | 1 | 1 | 120 | 236 | 0 | 1 | 178 | 0 | 0.8 | 2 | 0 | 2 | 1 |
4 | 57 | 0 | 0 | 120 | 354 | 0 | 1 |
对resting_blood_pressure标准化,cholesterol归一化
# 实例化
st_scaler = StandardScaler()
# 标准化
dt['resting_blood_pressure'] = st_scaler.fit_transform(dt[['resting_blood_pressure']])
print(dt['resting_blood_pressure'].head())
# 实例化
min_max_scaler = MinMaxScaler()
# 归一化
dt['cholesterol'] = min_max_scaler.fit_transform(dt[['cholesterol']])
print(dt['cholesterol'].head())
输出:
0 0.763956
1 -0.092738
2 -0.092738
3 -0.663867
4 -0.663867
Name: resting_blood_pressure, dtype: float64
0 0.244292
1 0.283105
2 0.178082
3 0.251142
4 0.520548
Name: cholesterol, dtype: float64