一.概念
数据预处理是指在进行数据分析和建模之前,对原始数据进行清洗、转换和集成等操作的过程。它的目的是将原始数据转化为可以用于分析和建模的规范化数据集,以提高数据的质量和可信度,减少数据误差和噪声对分析结果的影响。
数据预处理包括以下几个主要步骤:
- 数据清洗:去除重复数据、处理缺失值、处理异常值等,以确保数据的完整性和准确性。
- 数据转换:对数据进行归一化、标准化、离散化等操作,以便于进行统计分析和建模。
- 数据合并:将多个数据源的数据集合并为一个整体数据集,消除冗余和冲突。
- 数据降维:对高维数据进行降维操作,以便于进行可视化和分析。
- 数据规约:通过压缩和抽样等方法,减少数据量,提高数据处理效率。
数据预处理是数据挖掘和机器学习等领域中非常重要的一步,能够影响到后续的分析结果和模型效果。一个好的数据预处理过程可以提高模型的准确性和稳定性,从而使得数据分析和建模更加可靠和有效。
本博文主要介绍数据合并,数据清洗,数据转换
二.数据合并
1.导入数据集
获取表格对象的方法
import pandas as pd
这里使用的数据集链接为本人自用,想要数据集可以联系作者
2.拼接合并
概念:基于两个表共有的主键 (即某列数据)将两个表的数据根据主键相同原则进行拼接
拼接合并的实现方法 pd.concat0函数
语法结构: pd.concat([表格对象1,表格对象2],axis=0或1)
axis默认为0,表示横向拼接,axis=1时表示纵向拼接
纵向拼接
概念:指将两个列名相同的Dataframe表格对象上下拼接到一起。
例如:
df1 = pd.DataFrame({'A':[0,1],'B':[2,3]})
df2 = pd.DataFrame({'C':[0,1],'D':[2,3]})
df0 = pd.DataFrame({'C':[4,5],'D':[6,7]})
print('---------纵向拼接----------')
df4 = pd.concat([df0,df2])
print(df0)
print(df2)
print(df4)
输出的结果为
横向拼接
概念:指将两个列名相同的Dataframe表格对象上下拼接到一起。
代码为:
print('---------横向拼接----------')
print(df1)
print(df2)
df3 = pd.concat([df1,df2],axis=1)
print(df3)
输出的结果为
三.数据清洗
概念:去除重复数据、处理缺失值、处理异常值等,以确保数据的完整性和准确性。
1.数据去重
去重方法drop_duplicates()
去重的概念:删除某个序列或是表格中某个序列中的重复数据去重方法: DataFrame表格和Series序列对象内置方法drop duplicates(语法结构: 表格/序列对象dropduplicates(subset=None,keep='first,inplace=False)
(一)首先创建一个含有重复值的表格
df = pd.DataFrame(
[['甲',80],['甲',85],['乙',90]],
columns=['姓名','分数']
)
df
输出结果为:
(二)用drop_duplicates()方法进行数据去重
df.drop_duplicates(subset=['姓名'],keep='first',inplace=True)#inplace使修改在原数据上生效
df
数据去重后的结果对比:
成功去重。
2.缺失值的处理
2.1生成python中的缺失值
导入NumPy库
import numpy as np
(一)方法一:
print(np.nan)
(二)方法二:
print(float('nan'))
(三)方法三 (python自带空值):
print(None)
三个方法输出的结果分别为:
2.2缺失值的查找
(一)导入数据库
df = pd.read_csv(r'数据/新用户表.csv',encoding='gbk')
(二)表格对象isnull().sum()返回各列的缺失值数量。(方法一)
df.isnull().sum()
输出的结果:
表格对象info()方法。(方法二)
df.info()
输出的结果为:
2.3删除法处理
概念:删除某个缺失数据所在的行的所有数据
(一)首先创建一个表格
df_nan = pd.DataFrame(
[['甲',80,'1班'],[np.nan,np.nan,'1班'],['乙',np.nan,'1班']],
columns=['姓名','分数','班级']
)
df_nan
输出表格结果:
(二)情况一:针对一列来删除
语法结构: 表格对象dropna(axis=0,how='any',subset=Noneinplace=False)
df_nan.dropna(subset=['姓名'])
输出删除结果:
(三)情况二:针对多列并且任意一个人数据缺失就删除
df_nan.dropna(subset=['姓名','分数'],how='any')
输出结果:
(四)情况三:针对多列并且任意一个人数据缺失才删除
df_nan.dropna(subset=['姓名','分数'],how='all')
输出结果:
2.4填充法(替换法)处理缺失值
(一)筛选数据框df中省份('省份'列)为空值的行。
df[df['省份'].isnull()]
输出结果为:
(二)对不同的序列单独进行填充,性别用特殊值法填充
fillna函数的第一个参数是要填充的值,第二个参数'inplace=True'表示直接在原来的DataFrame上进行修改,而不是创建一个新的副本。
df['性别'].fillna('?',inplace=True)
对省份,城市用众数填充
df['省份'].fillna(df['省份'].mode()[0],inplace=True)
df['城市'].fillna(df['城市'].mode()[0],inplace=True)
查看14,20,21,26,56这几行(使用pandas库中的一种索引函数iloc())
df.iloc[[14,20,21,26,156],:]
(三)平均值法填充年龄
这里可以先计算DataFrame中"年龄"列的平均值,并通过round函数将结果四舍五入为整数
round(df['年龄'].mean())
df['年龄'].fillna(round(df['年龄'].mean()),inplace=True)
df.loc[[14,20,21,26,156]]
填充成功!
3.异常值处理
案例:处理航空公司用户的异常年龄(这里采用的数据库仍然是上方给出的数据库)
3.1.导入数据集
df_air = pd.read_excel(r'数据/航空公司数据.xlsx')
df_air
3.2.删除缺失值所在行
删除所有年龄缺失值所在行
使用dropna()函数删除包含缺失值的行或列。
subset=['']只删除 某一列中存在缺失值的行。
df_air.dropna(subset=['年龄'],inplace=True)
对数据框df_air中的'年龄'这一列进行直方图的绘制。
df_air['年龄'].hist()
3.3.定义正常值
(一)计算正常值区间:
Q3 = df_air['年龄'].quantile(0.75)
Q1 = df_air['年龄'].quantile(0.25)
IQR = Q3-Q1
注:序列对象.quantitle(小数x)查询(x*100)%分位数
(二)自定义的正常区间IQR的系数
c= 2
normal_low = Q1-c*IQR
normal_high = Q3 + c*IQR
print(normal_low,normal_high)
输出IQR的正常系数
3.4.定位异常数据
df_air.query('年龄<20 or 年龄>58')
3.5.以查带删实现异常数据的删除
df_air.query('年龄>=20 and 年龄<=68').reset_index(drop=True)
输出结果:
四.数据转换
数据转换是指将数据从一种形式或格式转换成另一种形式或格式的过程。在数据处理中,数据转换常用于将数据从一种结构转换成另一种结构,或者将数据从一种规范转换成另一种规范
1.数据结构转换
1.1 stack数据堆叠
案例:查询肥料表中某个肥料的具体化学成分
(一)导入数据集:
df_fl= pd.read_excel('../数据集合集/肥料含量表.xlsx')
df_fl
(二)构造一个提取肥料明细的函数:
def get_f1_detail(id):
return df_fl.stack()[id-1]
#stack方法表示数据堆叠
(三)查询某一号肥料的成分明细
get_f1_detail(2)
输出结果:
1.2unstack数据拆堆
unstack函数是用于将堆叠(stack)的数据重新拆分成原始的形式。
这里使用超市销售记录为例:
df_sale= pd.read_excel('../数据集合集/超市销售数据.xlsx')
df_sale.groupby(['性别','商品类别'])['支付费用(美元)'].sum().unstack()
2.数据类型转换
指的是数值型变量和类别型变量之间的转换
下面是一些常见的数据类型转换函数:
- int():将一个数值或字符串转换为整数类型。
- float():将一个数值或字符串转换为浮点数类型。
- str():将一个对象转换为字符串类型。
- list():将一个可迭代对象转换为列表类型。
- tuple():将一个可迭代对象转换为元组类型。
- set():将一个可迭代对象转换为集合类型。
2.1 数据分箱
数值型变量-->类别型变量(区间)
案例:统计不同平均速度区间下车辆的行驶时长、
(一)导入新能源汽车行驶里程表数据库:
df_car= pd.read_excel('../数据集合集/新能源汽车行驶里程表.xlsx')
df_car
(二)查看平均速度的分布情况:
df_car['平均速度'].hist()
(三)对平均速度进行数据分箱
df_car['平均速度区间']= pd.cut(df_car['平均速度'],bins=[20,40,60,80,100])
(四)对区间进行分组统计
df_car.groupby('平均速度区间')['行驶时长'].mean()
输出结果: