赞
踩
数据预处理(Data Preprocessing)是指在数据挖掘之前对原始数据进行的一些处理。现实世界中的数据几乎都是“脏”数据,所采集的数据极易受到不一致数据、噪声、缺失值的侵扰。
- 数据的不一致性:原始数据是从各种实际应用系统中采集的,而各应用系统的数据缺乏统一的标准和定义,数据结构具有较大的差异。
- 噪声数据:数据采集过程中会受到采集设备故障、数据传输错误或存储介质损坏等因素的干扰,导致采集到的数据可能含有噪声,即不精确或不准确的数据。
- 缺失值:系统设计缺陷或使用过程中的人为因素可能导致数据记录中某些属性值丢失或不确定,从而造成数据不完整,例如数据采集传感器故障导致某些数据无法采集等。
针对数据中存在的问题和数据质量要求,数据预处理过程主要包括数据清洗、数据集成、数据归约和数据变换等方法。
使用pandas的DataFrame对象类。
import numpy as np
import pandas as pd
df=pd.DataFrame(
[['1','张秀',21,'团员',np.NaN,np.NaN],
['2','李峰',20,np.NaN,'信息系','贵州'],
['3','王元',22,np.NaN,'计算机系',np.NaN]],
columns=['学号','姓名','年龄','政治面貌','系部','籍贯'])
print(df)
#打印出各列数据的非缺失值信息
print(df.info())
#打印出缺失值信息,缺失值时为True,非缺失值时为False
print(df.isnull())
#打印出各列中缺失值的数量
print(df.isnull().sum())
学号 姓名 年龄 政治面貌 系部 籍贯
0 1 张秀 21 团员 NaN NaN
1 2 李峰 20 NaN 信息系 贵州
2 3 王元 22 NaN 计算机系 NaN
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3 entries, 0 to 2
Data columns (total 6 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 学号 3 non-null object
1 姓名 3 non-null object
2 年龄 3 non-null int64
3 政治面貌 1 non-null object
4 系部 2 non-null object
5 籍贯 1 non-null object
dtypes: int64(1), object(5)
memory usage: 272.0+ bytes
None
学号 姓名 年龄 政治面貌 系部 籍贯
0 False False False False True True
1 False False False True False False
2 False False False True False True
学号 0
姓名 0
年龄 0
政治面貌 2
系部 1
籍贯 2
dtype: int64
根据一定的规则将含有缺失值的行或列直接进行删除。dropna() 为Pandas库中DataFrame的一个方法,用于删除缺失值。常用形式如下:
dropna(axis=0, how='any', thresh=None, subset=None, ,inplace=False)
import numpy as np
import pandas as pd
df=pd.DataFrame(
[['1','张秀',21,'团员',np.NaN,np.NaN],
['2','李峰',20,np.NaN,'信息系','贵州'],
['3','王元',22,np.NaN,'计算机系',np.NaN]],
columns=['学号','姓名','年龄','政治面貌','系部','籍贯'])
#删除含有缺失值的行
print("删除含有缺失值的行:\n",df.dropna())
#删除含有缺失值的列
print("删除含有缺失值的列:\n",df.dropna(axis=1))
#保留至少具有5个非NaN值的行
print("保留至少具有5个非NaN值的行:\n",df.dropna(thresh=5))
#保留至少具有3个非NaN值的列
print("保留至少具有3个非NaN值的列:\n",
df.dropna(thresh=3,axis=1))
删除含有缺失值的行:
Empty DataFrame
Columns: [学号, 姓名, 年龄, 政治面貌, 系部, 籍贯]
Index: []
删除含有缺失值的列:
学号 姓名 年龄
0 1 张秀 21
1 2 李峰 20
2 3 王元 22
保留至少具有5个非NaN值的行:
学号 姓名 年龄 政治面貌 系部 籍贯
1 2 李峰 20 NaN 信息系 贵州
保留至少具有3个非NaN值的列:
学号 姓名 年龄
0 1 张秀 21
1 2 李峰 20
2 3 王元 22
直接删除缺失值的样本并不是一个很好的方法,因此可以用一个特定的值替换缺失值。缺失值所在的属性为数值型时,通常利用其均值、中位数和众数等描述其集中趋势的统计量来填充;缺失值所在属性为类别型数据时,则可以选择众数来填充。
Pandas 库中提供了缺失值替换的方法 fillna() ,常用形式如下:
fillna(value=None,method=None,asxi=None,inplace=False,limit=None)
常见的填充方法有:
1. 填充固定值:选取某个固定值/默认值填充缺失值。
2. 填充均值:对每一列的缺失值,填充当前列的均值。
3. 填充中位数:对每一列的缺失值,填充当前列的中位数。
4. 填充众数:对每一列的缺失值,填充当前列的众数。如果存在某列缺失值过多,众数为NaN的情况,这时就取每列删除掉NaN值后的众数。
5. 填充上下样本的数据:对每一数据样本的缺失值,填充其上面一个或下面一个样本的数据值。
6. 填充插值得到的数据:用插值法拟合出缺失的数据,然后进行填充。常用interpolate()函数默认采用线性插值,即假设函数是直线形式,缺失值用前一个值和后一个值的平均数填充。
7. 填充KNN数据:填充近邻的数据,先利用KNN计算临近的k个数据,然后填充它们的均值。
8. 填充模型预测的值:把缺失值作为新的Label,建立模型得到预测值,然后进行填充。
import numpy as np
import pandas as pd
df=pd.DataFrame(
[['1','张秀',21,'团员',np.NaN,np.NaN],
['2','李峰',np.NaN,np.NaN,'信息系','贵州'],
['3','赵峰',np.NaN,np.NaN,'信息系','贵州'],
['4','王元',24,np.NaN,'计算机系',np.NaN]],
columns=['学号','姓名','年龄','政治面貌','系部','籍贯'])
print(df.fillna(-1)) #填充缺失值为'-1'
print(df.fillna(method='ffill')) #向下填充缺失值
#年龄列的缺失值用其均值填充
print(df['年龄'].fillna(df['年龄'].mean()))
print(df.fillna(df.mode())) #利用众数填充缺失值
for n in df:
df[n]=df[n].interpolate() #数值型属性用线性插值
df[n].dropna(inplace=True)
print(df)
学号 姓名 年龄 政治面貌 系部 籍贯
0 1 张秀 21.0 团员 -1 -1
1 2 李峰 -1.0 -1 信息系 贵州
2 3 赵峰 -1.0 -1 信息系 贵州
3 4 王元 24.0 -1 计算机系 -1
学号 姓名 年龄 政治面貌 系部 籍贯
0 1 张秀 21.0 团员 NaN NaN
1 2 李峰 21.0 团员 信息系 贵州
2 3 赵峰 21.0 团员 信息系 贵州
3 4 王元 24.0 团员 计算机系 贵州
0 21.0
1 22.5
2 22.5
3 24.0
Name: 年龄, dtype: float64
学号 姓名 年龄 政治面貌 系部 籍贯
0 1 张秀 21.0 团员 信息系 贵州
1 2 李峰 24.0 NaN 信息系 贵州
2 3 赵峰 NaN NaN 信息系 贵州
3 4 王元 24.0 NaN 计算机系 NaN
学号 姓名 年龄 政治面貌 系部 籍贯
0 1 张秀 21.0 团员 NaN NaN
1 2 李峰 22.0 NaN 信息系 贵州
2 3 赵峰 23.0 NaN 信息系 贵州
3 4 王元 24.0 NaN 计算机系 NaN
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。