目录

读取数据

找到所有离散特征

选择一个离散特征进行独热编码

对独热编码后的变量转化为int类型

采取循环对所有离散特征进行独热编码,并且转化为int类型

处理所有缺失值(DAY4所学)

Point of Confusion


今天的任务分成以下几步

  1. 读取数据
  2. 找到所有离散特征
  3. 选择一个离散特征进行独热编码
  4. 对独热编码后的变量转化为int类型
  5. 采取循环对所有离散特征进行独热编码,并且转化为int类型
  6. 加上昨天的内容 并且处理所有缺失值

读取数据

# 读取数据
import pandas as pd
data = pd.read_csv('data.csv') #此时data是一个DataFrame对象

找到所有离散特征

# day4的课提到了 查看dataframe对象的列名,可以使用data.columns属性。
data.columns 

# 打印所有的离散变量名
# 在python中对于变量名常常用英文含义和下划线来命名,而不借助拼音,这是便于他人阅读和理解代码的一种习惯。
# 连续的英文是continuous,离散的英文是discrete
for discrete_features in data.columns:
    if data[discrete_features].dtype == 'object':
        print(discrete_features)

#离散变量名1
#离散变量名2
#离散变量名3
.
.
.

# 以其中打印出来的一种离散变量名为例,打印观察下
data['离散变量名1']

# 使用 value_counts() 方法统计 data 数据框中 '离散变量名1' 列里每个不同值出现的次数
# 该方法会返回一个 Pandas 的 Series 对象,其中索引是 '离散变量名1' 列中的唯一值,值是对应唯一值出现的频数
# 这有助于快速了解 '离散变量名1' 列的数据分布情况。可以打印出这一列中每个不同取值的出现次数。
data['离散变量名1'].value_counts()

选择一个离散特征进行独热编码

上一步打印出来的(离散变量名1)数据无顺序关系,因此可以采用one-hot编码

# 对 离散变量名1 列进行独热编码
# get_dummies()函数可以将指定的列进行独热编码,返回一个新的DataFrame对象。
data = pd.get_dummies(data, columns=['离散变量名1'])
data.columns

#查看一下
data.head()

对独热编码后的变量转化为int类型

# 可以看到上面独热编码后的数据是bool类型,试着转换为int类型,因为后续可能有的函数计算不支持bool值
# 学习类型转换的方法
data['离散变量名1_该列中数据1'] =data ['离散变量名1_该列中数据1'].astype(int)
data['离散变量名1_该列中数据1']

采取循环对所有离散特征进行独热编码,并且转化为int类型

# 现在尝试结合之前的代码一次性对所有离散特征独热编码
# 重新读取数据
data = pd.read_csv("data.csv")
# 找到离散变量
discrete_lists = [] # 新建一个空列表,用于存放离散变量名
for discrete_features in data.columns:
    if data[discrete_features].dtype == 'object':
        discrete_lists.append(discrete_features)

# 离散变量独热编码
data = pd.get_dummies(data, columns=discrete_lists, drop_first=True) 

data.columns

 此时还有个困难,如何找到所有独热编码后的新特征名呢?

# 对比独热编码前后的列名 即可

# 从 'data.csv' 文件中读取数据,并将其存储为一个 Pandas 的 DataFrame 对象 data2
# 这里假设 data2 是独热编码前的数据
data2 = pd.read_csv("data.csv")
# 新建一个空列表 list_final,用于存放独热编码后新增的特征名
list_final = [] 
# 遍历独热编码后数据框 data 的所有列名
for i in data.columns:
    # 检查当前列名 i 是否不存在于独热编码前的数据框 data2 的列名中
    if i not in data2.columns:
        # 如果该列名在 data2 中不存在,说明它是独热编码后新增的列名
        # 将这个新增的列名添加到 list_final 列表中
        list_final.append(i) 
# 返回存储独热编码后新增特征名的列表
list_final

# 其实还可以通过data.columns.difference()方法来实现,请自行学习
# 可以看到 想要实现一个结果有很多不同方法
# 接着之前的,对bool特征进行类型转换 转换为int类型
for i in list_final:
    data[i] = data[i].astype(int) # 这里的i就是独热编码后的特征名
data.head()

处理所有缺失值(DAY4所学)

# 查看数据框 data 中每一列的数据类型
# 该方法会返回一个包含列名及其对应数据类型的 Pandas Series 对象
# 有助于了解数据的结构,为后续的数据处理和分析(如数据清洗、特征工程等)提供依据
data.dtypes

# 统计每一列的缺失值个数
data.isnull().sum() 

# 用均值填补
# 循环遍历这个列表中的每一列
for i in data.columns:
    if data[i].isnull().sum() > 0: # 找到存在缺失值的列
        #计算该列的均值
        mean_value = data[i].mean()
        #用均值填充缺失值
        data[i].fillna(mean_value, inplace=True)

data.isnull().sum()

#或者
# 用众数填补
# 循环遍历这个列表中的每一列
for i in data.columns:
    if data[i].isnull().sum() > 0: # 找到存在缺失值的列
        # 计算该列的众数,众数可能有多个,取第一个
        mode_value = data[i].mode()[0]
        # 用众数填充缺失值
        data[i].fillna(mode_value, inplace=True)

data.isnull().sum()

Point of Confusion

Q:不做 “对独热编码后的变量转化为 int 类型” 这一步可以吗

A:通常情况下是可以的,但可能会对后续的操作产生一些影响。独热编码后的变量默认是布尔类型,在大多数数据分析和建模工具中,布尔类型和 int 类型在很多操作上是兼容的。不过,有些模型可能更倾向于使用数值类型的数据,将其转换为 int 类型可以避免一些潜在的问题。而且,int 类型的数据在存储和计算上可能会更高效一些。

Q:“先处理所有缺失值,再对独热编码后的变量转化为 int 类型” 可以吗

A:可以的。处理缺失值的顺序并不是固定的,你可以在独热编码之前处理缺失值,也可以在独热编码之后处理。在独热编码之前处理缺失值,可以避免缺失值对编码过程产生影响;而在独热编码之后处理缺失值,可能会更方便一些,因为独热编码后的变量已经转换为二进制向量,处理起来可能会更简单。不过,无论选择哪种顺序,最终都要确保数据中没有缺失值,并且编码后的变量类型符合后续分析和建模的要求。

@浙大疏锦行

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐