Python训练营Day8实战进阶指南
一、字典的简单介绍
可以去b站找个视频 或者 csdn找个帖子看下字典的简单介绍—-锻炼下自学能力
但是目前我们只会用到映射这个用法,他需要传入的是字典,因为字典的键值对,键是唯一的,值可以重复。这很符合数据的特征是固定的,但是值可以变化这个特性。
所以后续想完成新的映射,直接修改字典的键值对即可。
输入:
# 使用花括号创建字典
dict = {'name': 'Alice', 'age': 25, 'city': 'New York'}
dict
输出:
{'name': 'Alice', 'age': 25, 'city': 'New York'}
代码解释:
{'name': 'Alice', 'age': 25, 'city': 'New York'} 是一个字典字面量,使用花括号 {} 创建。字典由键值对组成,键和值之间用冒号 : 分隔,不同键值对之间用逗号 , 分隔。这里的键分别是 'name' 、 'age' 和 'city' ,对应的值分别是 'Alice' 、 25 和 'New York' 。
输入:
dict['name'] # 访问字典中的值
输出:
'Alice'
二、标签编码
之前介绍了离散数据 如果是不存在顺序,则采用独热编码,函数为pd.get_dummies()
现在介绍对于存在顺序和大小关系的离散特征,做好标签编码,借助dataframe的map函数即可实现
输入:
import pandas as pd
data = pd.read_csv('data.csv')
输入:
data.head()
输出:

这里我们给Home Oweners来完成标签编码,实际上这个特征也可以独热编码,取决于你的理解。实际中,都试一下 ,谁训练出来的模型好选谁。
输入:
data["Home Ownership"].value_counts()
输出:
Home Mortgage 3637
Rent 3204
Own Home 647
Have Mortgage 12
Name: Home Ownership, dtype: int64
上面这些翻译也不一定对,这是我个人对数据的理解。
按照贷款严重程度(抗风险能力),依次是:自有住房 < 租房 < 有其他贷款 < 住房抵押贷款
所以按照这个逻辑来进行编码
输入:
# 定义映射字典
mapping = {
"Rent": 0,
"Own Home": 1,
"Have Mortgage ": 2,
"Home Mortgage": 3
}
data["Home Ownership"].head()
输出:
0 Own Home
1 Own Home
2 Home Mortgage
3 Own Home
4 Rent
Name: Home Ownership, dtype: object
输入:
data["Home Ownership"] = data["Home Ownership"].map(mapping)
data["Home Ownership"].head()
输出:
0 1.0
1 1.0
2 3.0
3 1.0
4 0.0
Name: Home Ownership, dtype: float64
代码解释:
.map(mapping) : map() 是 pandas 中 Series 对象的方法,它会根据传入的映射关系 mapping (一个字典),将 Series 中的每个值替换为 mapping 字典中对应的值。如果 Series 中的某个值在 mapping 字典中不存在,那么该值会被替换为 NaN 。
输入:
data["Term"].value_counts()
输出:
Short Term 5556
Long Term 1944
Name: Term, dtype: int64
对于字符串类型 我们也要映射成整数类型,这里不要理解为标签编码或者独热编码
二分类的问题不需要独热编码,比如性别这个特征,男女不需要变成2个特征,性别男 性别女 。因为他们二者自由度为1,如果是2个特征的话,性别男=1,那么性别女必定等于0.这样特征高度相关,没有价值。
此时这个特征的含义不是性别,而是:是否为男性,1是男性,0是非男。
三分类以上才涉及独热编码
输入:
# 定义映射字典
mapping = {
"Short Term": 1,
"Long Term": 0
}
# 进行映射
data["Term"] = data["Term"].map(mapping)
data["Term"].head()
输出:
0 1
1 0
2 1
3 1
4 1
Name: Term, dtype: int64
实际上借助一个映射函数也可以实现上面2次编码
字典的键值对可以嵌套字典
输入:
import pandas as pd
# 重新读取数据
data = pd.read_csv("data.csv")
# 嵌套映射字典
mapping = {
"Term": {
"Short Term": 1,
"Long Term": 0
},
"Home Ownership": {
"Rent": 0,
"Own Home": 1,
"Have Mortgage ": 2,
"Home Mortgage": 3
}
}
输入:
mapping["Term"] # 访问嵌套字典中的值,此时他又是一个字典
输出:
{'Short Term': 1, 'Long Term': 0}
输入:
# 对 Home Ownership 列进行映射
data["Home Ownership"] = data["Home Ownership"].map(mapping["Home Ownership"])
# 对 Term 列进行映射
data["Term"] = data["Term"].map(mapping["Term"])
data.head()
输出:

三、连续变量的处理
归一化和标准化可以通过手写函数实现,也可以使用sklearn中的归一化和标准化函数。


输入:
# 对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
data['Annual Income'] = manual_normalize(data['Annual Income'])
data['Annual Income'].head()
输出:
0 0.031798
1 0.086221
2 0.058771
3 0.064145
4 0.061260
Name: Annual Income, dtype: float64
逐行解释:
def manual_normalize(data):
def manual_normalize(data): :定义了一个名为 manual_normalize 的函数,它接收一个参数 data ,这个参数代表要进行归一化处理的数据。
min_val = data.min()
max_val = data.max()
normalized_data = (data - min_val) / (max_val - min_val)
这行代码实现了归一化的核心逻辑。归一化公式为 $x_{normalized} = \frac{x – x_{min}}{x_{max} – x_{min}}$,这里将输入数据 data 减去最小值 min_val ,再除以最大值与最小值的差值 max_val – min_val ,得到归一化后的数据,并将结果赋值给 normalized_data 。
return normalized_data
这行代码将归一化后的数据作为函数的返回值,结束函数的执行。
data['Annual Income'] = manual_normalize(data['Annual Income'])
这行代码调用 manual_normalize 函数对 data 数据框中的 Annual Income 列进行归一化处理,并将归一化后的结果重新赋值给 data 数据框的 Annual Income 列,完成该列数据的更新。
data['Annual Income'].head()
调用 head() 方法查看 data 数据框中 Annual Income 列归一化后的前 5 行数据,方便检查归一化操作是否成功。
输入:
# 借助sklearn库进行归一化处理
from sklearn.preprocessing import StandardScaler, MinMaxScaler
data = pd.read_csv("data.csv")# 重新读取数据
# 归一化处理
min_max_scaler = MinMaxScaler() # 实例化 MinMaxScaler类,之前课上也说了如果采取这种导入函数的方式,不需要申明库名
data['Annual Income'] = min_max_scaler.fit_transform(data[['Annual Income']])
data['Annual Income'].head()
输出:
0 0.031798
1 0.086221
2 0.058771
3 0.064145
4 0.061260
Name: Annual Income, dtype: float64
逐行解释:
from sklearn.preprocessing import StandardScaler, MinMaxScaler
从 sklearn 库的 preprocessing 模块导入 StandardScaler 和 MinMaxScaler 类。
data = pd.read_csv("data.csv")
这里使用 pandas 库的 read_csv 函数读取 data.csv 文件,并将读取的数据存储在 data 这个 DataFrame 对象中。注意,代码里使用了 pd ,这意味着之前应该已经导入了 pandas 库( import pandas as pd )。
min_max_scaler = MinMaxScaler()
实例化了 MinMaxScaler 类,创建了一个 min_max_scaler 对象,后续会用这个对象来对数据进行归一化处理。
data['Annual Income'] = min_max_scaler.fit_transform(data[['Annual Income']])
fit_transform 是 MinMaxScaler 对象的方法,它完成了两个操作:
data[['Annual Income']] 传递的是一个二维数组,因为 fit_transform 方法要求输入是二维数组。处理后的数据会覆盖 data 里 Annual Income 列原来的数据。
data['Annual Income'].head()
调用 head 方法查看 data 中 Annual Income 列归一化后的前 5 行数据,方便检查归一化操作是否成功。
知识点:
在代码 data[['Annual Income']] 里使用两个中括号,是因为 min_max_scaler.fit_transform() 方法要求输入是二维数组(在 pandas 里对应 DataFrame 类型),下面详细解释:
1. pandas 中单个中括号与双个中括号的区别
单个中括号 :当你使用单个中括号 data['Annual Income'] 时,返回的是一个 pandas.Series 对象,这是一维的数据结构。 Series 可以理解为带有索引的一维数组。
双个中括号 :使用双个中括号 data[['Annual Income']] 时,返回的是一个 pandas.DataFrame 对象,这是二维的数据结构。 DataFrame 可以看作是由多个 Series 组成的表格,每一列都是一个 Series 。
2. fit_transform() 方法的输入要求
MinMaxScaler 类的 fit_transform() 方法要求输入是二维数组。 DataFrame 符合这个要求,因为它是二维的数据结构;而 Series 是一维的,不满足 fit_transform() 方法的输入要求。如果传入 Series ,会引发错误。
综上所述,代码里使用两个中括号 data[['Annual Income']] 是为了确保传递给 fit_transform() 方法的是二维的 DataFrame 对象,从而避免报错。
输入:
# 标准化处理
data = pd.read_csv("data.csv")# 重新读取数据
scaler = StandardScaler() # 实例化 StandardScaler,
data['Annual Income'] = scaler.fit_transform(data[['Annual Income']])
data['Annual Income'].head()
输出:
0 -1.046183
1 -0.403310
2 -0.727556
3 -0.664078
4 -0.698155
Name: Annual Income, dtype: float64
至此,常见的预处理方式都说完了
作业:对心脏病数据集的特征用上述知识完成,一次性用所有的处理方式完成预处理,尝试手动完成,多敲几遍代码。
输入:
import pandas as pd
data = pd.read_csv('heart.csv')
data.head()
输出:

输入:
data["cp"].value_counts()
输出:
cp
0 143
2 87
1 50
3 23
Name: count, dtype: int64
输入:
# 定义映射字典
cp = {
0: 0,
1: 1,
2: 2,
3: 3
}
data["cp"].head()
输出:
0 3
1 2
2 1
3 1
4 0
Name: cp, dtype: int64
输入:
data["cp"] = data["cp"].map(cp)
data["cp"].head()
输出:
0 3
1 2
2 1
3 1
4 0
Name: cp, dtype: int64
输入:
# 借助sklearn库进行归一化处理
from sklearn.preprocessing import StandardScaler, MinMaxScaler
data = pd.read_csv("heart.csv")# 重新读取数据
# 归一化处理
min_max_scaler = MinMaxScaler() # 实例化 MinMaxScaler类,之前课上也说了如果采取这种导入函数的方式,不需要申明库名
data['oldpeak'] = min_max_scaler.fit_transform(data[['oldpeak']])
data['oldpeak'].head()
输出:
0 0.370968
1 0.564516
2 0.225806
3 0.129032
4 0.096774
Name: oldpeak, dtype: float64
输入:
0 0.370968
1 0.564516
2 0.225806
3 0.129032
4 0.096774
Name: oldpeak, dtype: float64
输入:
# 标准化处理
data = pd.read_csv("heart.csv")# 重新读取数据
scaler = StandardScaler() # 实例化 StandardScaler,
data['oldpeak'] = scaler.fit_transform(data[['oldpeak']])
data['oldpeak'].head()
输出:
0 1.087338
1 2.122573
2 0.310912
3 -0.206705
4 -0.379244
Name: oldpeak, dtype: float64
@浙大疏锦行
作者:低维歌者