目录
一、了解数据清洗
1、什么是数据清洗
2、数据清洗步骤
1)缺失值处理
2)异常值处理
3)重复值处理
4)格式修正
5)数据一致性检查
6)数据类型转换
二、数据清洗用法
1、有如下文件内容
2、完整代码
1)代码1
2)自建包fill_na.py内代码:
1、运行结果
2、调试结果:
3)数据处理后的内容:
一、了解数据清洗
1、什么是数据清洗
数据清洗是指发现并纠正数据文件中可识别的错误的最后一道程序,包括检查数据一致性,处理无效值和缺失值等。 换句话说,数据清洗的目的是删除重复信息、纠正存在的错误,并提供数据一致性。在进行数据清洗时,需要按照一定的规则把“脏数据”“洗掉”,以确保数据的准确性和可靠性。
2、数据清洗步骤
1)缺失值处理
找出数据中的缺失值,并根据具体情况进行处理,可以通过删除包含缺失值的样本、使用均值或中位数等等 进行填充,或使用其他合适的方法来处理缺失值。
2)异常值处理
检测并处理数据中的异常值,这些异常值可能是由于测量错误、输入错误或其他原因导致的,可以通过删除异常值、替换为合适的值或使用其他方法进行处理。
3)重复值处理
检测并删除数据中的重复值,这些重复值可能是由于数据输入错误、数据复制或其他原因导致的,重复值可能会对模型的训练和性能产生负面影响。
4)格式修正
将数据转换为统一的格式,例如将日期转换为特定的日期格式、将文本转换为小写或大写、移除多余的空格等。
5)数据一致性检查
对数据进行逻辑一致性检查,确保数据在不同字段、不同记录之间保持一致。
6)数据类型转换
将数据转换为适当的数据类型,例如将字符串转换为数值型、将文本转换为分类变量等。
二、数据清洗用法
1、有如下文件内容
(内容随意敲的)
此时图中有一些无用的字符,还有一些空值,接下来要对这组数据进行数据预处理
2、完整代码
1)代码1
import pandas as pd
import matplotlib.pyplot as plt
data = pd.read_excel('111.xlsx') # 导入文件
data = data[data['矿物类型'] != 'D'] # 删除无用的类别D
null_num = data.isnull() # 判断是否为空,返回布尔值
null_total = null_num.sum() # 对上述布尔类型的值进行求和,默认True为1,False为0
x_whole = data.drop('矿物类型',axis=1) # 将除了矿物类型的列当做特征集
y_whole = data.矿物类型 # 将矿物类型列当做标签集
label_dict = {'A':0,'B':1,'C':2} # 定义一个字典,用来将矿物类型转换为整型
encoded_label = [label_dict[label] for label in y_whole] # 利用列表生成式,遍历标签集中的每一个字符串类型的类别,利用字典键值对的作用,将原来的值更改为整型,
y_whole = pd.Series(encoded_label,name='矿物类型') # 将上述转变后的数据更改为Series类型,并赋值给原始标签集
"""去除无用符号"""
for column_name in x_whole.columns: # 遍历特征集的列名
x_whole[column_name] = pd.to_numeric(x_whole[column_name],errors='coerce')
# 使用numpy的用法to_numeric,将取出每列的数据转换为数值型,参数error表示如果转换为数值类型发生错误,就将那个值转换为Nan
""" Z标准化 """
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
x_whole_z = scaler.fit_transform(x_whole) # 将去除无用符号的特征集数据进行z标准化
x_whole = pd.DataFrame(x_whole_z,columns=x_whole.columns) # z标准化后为numpy数据,将其转换为dataframe类型
""" 数据集切分 """
from sklearn.model_selection import train_test_split
x_train_w,x_test_w,y_train_w,y_test_w = train_test_split(x_whole,y_whole,test_size=0.2,random_state=0)
""" 填充空值 """
import fill_na # 导入自己写的填充函数
# 使用均值填充,调用自己写的函数,对空值进行填充
x_train_fill,y_train_fill = fill_na.mean_train_fill(x_train_w,y_train_w) # 训练集的填充
x_test_fill,y_test_fill = fill_na.mean_test_fill(x_train_fill,y_train_fill,x_test_w,y_test_w) # 测试集的填充
""" 对数据进行过采样,防止过拟合 """
from imblearn.over_sampling import SMOTE
oversampler = SMOTE(k_neighbors=1,random_state=0) # k_neighbors=1表示最近邻的邻居个数,以及随机种子
os_x_train,os_y_train = oversampler.fit_resample(x_train_fill,y_train_fill) # 输入参数训练集特征和标签,将他们进行过拟合操作,返回两个新的训练数据集
""" 绘制每个类别数据个数图 """
y_whole = pd.concat([os_y_train,y_test_fill]) # 合并过拟合后的数据
labels_count= pd.value_counts(y_whole) # 返回每个类别的数据个数
fig,ax = plt.subplots() # 使用subplot创建子图,fig表示整个图像,ax表示子图坐标区域
bars = ax.bar(labels_count.index,labels_count.values) # 表示在指定区域绘制条形图,x轴表示数据的索引,y轴表示值
for bar in bars: # 遍历每一个条形图
yval = bar.get_height() # 获取每个条形图的高度
# 在条形图上增加文本,用bar.get()+bar.get_width()/2计算文本的水平位置
ax.text(bar.get_x()+bar.get_width()/2,yval,round(yval,2),va='bottom',ha='center',fontsize=10,color='black')
plt.xlabel('lables') # x轴名字
plt.ylabel('numbers') # y轴名字
plt.title('The number of data for each category after removing empty data') # 标题
plt.show()
data_train = pd.concat([os_y_train,os_x_train],axis=1).sample(frac=1,random_state=0) # sample(frac=1,random_state=0)表示随机选择行,frac表示返回样本比例
data_test = pd.concat([y_test_fill,x_test_fill],axis=1)
data_train.to_excel(r'./训练数据集[均值填充].xlsx',index=False)
data_test.to_excel(r'./测试数据集[均值填充].xlsx',index=False)
2)自建包fill_na.py内代码:
import pandas as pd
""" 使用均值填充 """
def mean_method(data): # 参数为data
fill_values = data.mean() # mean会计算每一列的均值,然后返回给fill_values
return data.fillna(fill_values) # 返回 均值填充到data的数据
def mean_train_fill(train_data, train_label): # 传入两个参数,一个是训练的特征集,一个训练的标签
data = pd.concat([train_data, train_label], axis=1) # 将特征集和标签集合并
data = data.reset_index(drop=True) # 重置合并后数据的索引
A = data[data['矿物类型'] == 0] # 将标签为0的数据取出,赋值给A
B = data[data['矿物类型'] == 1] # 将标签为1的数据取出,赋值给B
C = data[data['矿物类型'] == 2] # 将标签为2的数据取出,赋值给C
A = mean_method(A) # 调用mean_method函数对A类别中的数值进行求均值后再进行填充
B = mean_method(B)
C = mean_method(C)
df_filled = pd.concat([A, B, C]) # 填充完后将每一类数据合并
df_filled = df_filled.reset_index(drop=True) # 重置索引
return df_filled.drop('矿物类型', axis=1), df_filled.矿物类型 # 返回训练集的特征和标签
def mean_test_method(train_data, test_data):
fill_values = train_data.mean() # 对训练集的数据进行求均值
return test_data.fillna(fill_values) # 将训练集计算的均值填充到测试集
def mean_test_fill(train_data, train_label, test_data, test_label): # 导入填充好的训练集数据和标签,以及未填充的测试集特征和标签
train_data_all = pd.concat([train_data, train_label], axis=1) # 合并填充好的训练集数据
train_data_all = train_data_all.reset_index(drop=True) # 重置索引
test_data_all = pd.concat([test_data, test_label], axis=1) # 合并未处理的测试集数据
test_data_all = test_data_all.reset_index(drop=True)
A_train = train_data_all[train_data_all['矿物类型'] == 0] # 取出训练集中0类别的数据
B_train = train_data_all[train_data_all['矿物类型'] == 1]
C_train = train_data_all[train_data_all['矿物类型'] == 2]
A_test = test_data_all[test_data_all['矿物类型'] == 0] # 取出测试集中0类别的数据
B_test = test_data_all[test_data_all['矿物类型'] == 1]
C_test = test_data_all[test_data_all['矿物类型'] == 2]
A = mean_test_method(A_train, A_test) # 调用上述函数mean_test_method,输入参数0类别的数据的训练集和测试集合,返回填充后的0类别测试集数据
B = mean_test_method(B_train, B_test)
C = mean_test_method(C_train, C_test)
df_filled = pd.concat([A, B, C]) # 合并处理完三个类别的测试集数据
df_filled = df_filled.reset_index(drop=True)
return df_filled.drop('矿物类型', axis=1), df_filled.矿物类型 # 返回测试集的特征集和标签集
1、运行结果
2、调试结果:
3)数据处理后的内容:
(还有其他填充方法,例如直接删除空值、中位数填充、众数填充、线性回归填充、随机森林填充等等,代码大致相同,可私信发代码)