python|字典,标签编码与连续特征处理
·
1.预备知识:字典
字典用于存储键值对(key-value pairs)。字典是无序的、可变的,并且键(key)必须是唯一的。
(1)基本结构
字典使用花括号 {} 定义,每个键值对用冒号 : 分隔,键值对之间用逗号 , 分隔。
my_dict = {
"键1": "值1",
"键2": "值2",
"键3": "值3"
}
(2)字典的特点
- 键必须唯一:如果重复赋值,后面的值会覆盖前面的值。
- 键必须是不可变类型:例如字符串、数字、元组,但列表等可变类型不能作为键。
- 值可以是任意类型:包括数字、字符串、列表、字典等。
person = {
"name": "Alice",
"age": 25,
"hobbies": ["reading", "swimming"],
"contact": {"email": "alice@example.com", "phone": "123-4567"}
}
(3)字典的基本操作
- 访问值
通过键来获取对应的值,如果键不存在会报错。
scores = {"Alice": 90, "Bob": 85, "Charlie": 95}
print(scores["Alice"]) # 输出: 90
# 安全访问:使用 get() 方法,键不存在时返回默认值(如 None)
print(scores.get("David")) # 输出: None
print(scores.get("David", 0)) # 输出: 0(指定默认值)
- 修改/添加键值对
直接通过键赋值即可。
# 修改已有键的值
scores["Bob"] = 88
# 添加新键值对
scores["David"] = 75
print(scores) # 输出: {'Alice': 90, 'Bob': 88, 'Charlie': 95, 'David': 75}
- 删除键值对
# 删除指定键
del scores["Charlie"]
# 删除并返回指定键的值
david_score = scores.pop("David")
print(scores) # 输出: {'Alice': 90, 'Bob': 88}
(4)字典的常用方法:

(5)遍历字典:
scores = {"Alice": 90, "Bob": 85, "Charlie": 95}
# 遍历键(默认方式)
for name in scores:
print(name) # 输出: Alice, Bob, Charlie
# 遍历值
for score in scores.values():
print(score) # 输出: 90, 85, 95
# 同时遍历键和值(推荐方式)
for name, score in scores.items():
print(f"{name}: {score}") # 输出: Alice: 90, Bob: 85, Charlie: 95
2.标签编码
标签编码是将分类变量的每个类别映射为一个整数。适用于有序分类变量即类别之间存在自然的顺序关系。借助dataframe的map函数即可实现。
这里我们给Home Oweners来完成标签编码(信贷风险预测数据),按照贷款严重程度(抗风险能力),依次是:自有住房 < 租房 < 有其他贷款 < 住房抵押贷款。所以按照这个逻辑来进行编码
# 定义映射字典
mapping = {
"Own Home": 0,
"Rent": 1,
"Have Mortgage ": 2,
"Home Mortgage": 3
}
data["Home Ownership"] = data["Home Ownership"].map(mapping)
对于字符串类型 我们也要映射成整数类型,这里不要理解为标签编码或者独热编码。
此外二分类的问题不需要独热编码,比如性别这个特征,男女不需要变成2个特征,性别男 性别女 。因为他们二者自由度为1,如果是2个特征的话,性别男=1,那么性别女必定等于0.这样特征高度相关,没有价值。此时这个特征的含义不是性别,而是:是否为男性,1是男性,0是非男。
三分类以上才涉及独热编码。
实际上借助一个映射函数也可以实现上面2次编码,字典的键值对可以嵌套字典(字典的值可以是一个字典)
import pandas as pd
# 重新读取数据
data = pd.read_csv("data\data.csv")
# 嵌套映射字典
mapping = {
"Term": {
"Short Term": 1,
"Long Term": 0
},
"Home Ownership": {
"Rent": 0,
"Own Home": 1,
"Have Mortgage ": 2,
"Home Mortgage": 3
}
}
# 对 Home Ownership 列进行映射
data["Home Ownership"] = data["Home Ownership"].map(mapping["Home Ownership"])
# 对 Term 列进行映射
data["Term"] = data["Term"].map(mapping["Term"])
3.连续变量的处理:
(1)归一化

何时选用归一化:
- 数据分布未知或不需要保留分布形状。
- 算法对数据范围敏感(如神经网络、KNN)。
- 数据无明显异常值。
# 对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'])
# 借助sklearn库进行归一化处理
from sklearn.preprocessing import StandardScaler, MinMaxScaler
data = pd.read_csv("data\data.csv")
# 归一化处理
min_max_scaler = MinMaxScaler() # 实例化 MinMaxScaler类,如果采取这种导入函数的方式,不需要申明库名
data['Annual Income'] = min_max_scaler.fit_transform(data[['Annual Income']])
(2)标准化
何时选用标准化:
- 数据分布接近正态分布。
- 算法假设数据服从标准正态分布(如 PCA)。
- 存在异常值(标准化更稳健)。
# 标准化处理
data = pd.read_csv("data\data.csv")# 重新读取数据
scaler = StandardScaler() # 实例化 StandardScaler,
data['Annual Income'] = scaler.fit_transform(data[['Annual Income']])
data['Annual Income'].head()
更多推荐
所有评论(0)