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()

@浙大疏锦行

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐