数据预处理

Posted 觉行悟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据预处理相关的知识,希望对你有一定的参考价值。

第三章 数据预处理

3.1熟悉数据

【例】餐饮企业的决策者想要了解影响餐厅销量的一些因素,如天气的好坏,促销活动是否能影响餐厅的销量,周末和非周末餐厅销量是否有大的差别。餐厅手机的数据存储在sales.csv中,前五行的数据如下所示,请利用Python查看数据集的基本信息

1、数据表的基本信息查看

关键技术:使用info()方法查看数据的基本类型

import pandas as pd
df1=pd.read-csv("地址",sep=",",encoding="gbk")
df1.info()

2、查看数据表的大小

【例】请利用python查看上例中sales.csv文件中的数据表的大小,要求返回数据表中行的个数和列的个数

关键技术:使用pandas库中的DataFrame对象的shape()方法

import pandas as pd
df1=pd,read_csv("地址",sep=",",encoding="gbk")
d=df1.shape[0]
w=df1.shape[1]
print('数据表的行数为%d'%d)
print('数据表的列数为%d'%w)

3、数据格式的查看

【例】请利用Python分别生成10行3列的DataFrame类型数据df和数组型数据arr,并且要求df和arr数值的取值范围在6-10之间,df的列名为a,b,c。最后返回df和arr的数据类型

关键技术:type()方法

import pandas as pd
import numpy as np
#创建df和arr数据
df=pd.DataFrame(np.random.randint(6,10,size=(10,3)),columns=['a','b','c'])
arr=np.random.randint(6,10,size=(10,3))
#打印df和arr数据和其数据类型
print('df的数据类型为:')
print(type(df))
print('arr的数据类型为')
print(type(arr))
df的数据类型为:
<class 'pandas.core.frame.DataFrame'>
arr的数据类型为
<class 'numpy.ndarray'>

【例】同样对于 前一个立体给定的数据文件,读取后请利用Python查看数据格式是字符串还是数字格式

关键技术:dtype属性和dfypes属性

在上例代码的基础上,对于series数据可以用dtype查看,对于dataframe 数据可以用dtype查看 ,对dataframe数据可以用dtypes查看,程序代码如下:

print(df.dtypes)
a    int32
b    int32
c    int32
dtype: object
print(arr.dtype)
int32

4、查看具体的数据分布

在进行数据分析时,需要对数据的分布进行初步分析,包括统计数据的元素个数、均值、方差、最小值、最大值和分位数

关键技术:describe()函数。用于描述数据统计量特征,其返回值用count表示、mean表示数据的平均值、std表示数据的标准差、min表示数据的最小值、max表示数据的最大值,25%、50%、75%分别表示数据的一分位、二分位、三分位

3.2缺失值处理

1、缺失值检查

【例】某程序员对淘宝网站爬虫后得到的原始数据集item.csv,文件内容形式如下所示。请利用Python检查各列确实数据的个数并汇总

关键技术:isnull()方法。isnull()函数返回值为布尔值,如果数据存在缺失值,返回True,否则返回False

import pandas as pd
#导入item.csv文件
df=pd.read_csv("地址",sep=",",encoding="gbk")
print(df.isnull())

#打印df各列缺失值的数量
print(df.isnull().sum())

2、缺失值删除

【例】对于缺失值进行删除处理

关键技术:dropna()方法,用于删除含有缺失值的行

df.dropna()

【例】当某行或某列值都为NaN时,才删除整行或整列,这种情况如何处理

关键技术:dropna()方法的how参数

import pandas as pd
#创建df数据
df=pd.DataFrame('item1':[None,2,3,4,None],'item2':[1,2,3,4,None],'item3':[1,None,3,4,None],'item4':[1,2,None,None,None],'item5':[1,2,3,None,None],'item6':[None,None,None,None,None])
print(df)
print("当整行都为NaN时,删除整行")
df.dropna(how='all',axis=0)
   item1  item2  item3  item4  item5 item6
0    NaN    1.0    1.0    1.0    1.0  None
1    2.0    2.0    NaN    2.0    2.0  None
2    3.0    3.0    3.0    NaN    3.0  None
3    4.0    4.0    4.0    NaN    NaN  None
4    NaN    NaN    NaN    NaN    NaN  None
当整行都为NaN时,删除整行

Out[4]:

item1item2item3item4item5item6
0NaN1.01.01.01.0None
12.02.0NaN2.02.0None
23.03.03.0NaN3.0None
34.04.04.0NaNNaNNone
print("当整列都为NaN时,删除整列")
df.dropna(how='all',axis=1)
当整列都为NaN时,删除整列

Out[5]:

item1item2item3item4item5
0NaN1.01.01.01.0
12.02.0NaN2.02.0
23.03.03.0NaN3.0
34.04.04.0NaNNaN
4NaNNaNNaNNaNNaN

【例】当某行有一个数据为NaN时,就删除整行和当某列有一个数据为NaN时就删除整列

df2=dropna(how='any',axis=0)

3、缺失值替换、填充

均值填补法、近邻填补法、插值填补法等等

本小节介绍fillna方法

【例】使用近邻填补法,即利用缺失值最近邻的值来填补数据,对df数据中的缺失值进行填补

关键技术:fillna()方法中的method方法

在本案例中可以将fillna()方法中的method参数设置为bfill,来使用缺失值后面的数据进行填充

【例】若使用缺失值前面的值进行填充来填补数据,如何实现

本案例可以用fillna()方法中的method参数设置设置为ffill,来使用缺失值前面的值进行填充

【例】请利用二次多项式插值法对df数据中的item2列的缺失值进行填充

关键技术:interpolate方法极其order参数

设置为2即可满足要求

【例】请对df数据中的item2列的三次样条插值填充

关键技术:三次样条插值,即利用一个三次多项式来逼近原目标函数,然后求解该三次多项式的极小点来作为原目标函数的近似极小点

将interpolate方法的method参数设置为spline,将order参数设置为3

df['item2'].interpolate(method="spline",o)

3.3重复值处理

1、发现重复值

在数据的采集过程中,有时会存在对同一数据进行重复采集的情况,重复值的存在会对数据分析的结果产生不良影响,因此在进行数据分析之前 ,对数据的重复值进行处理是十分必要的

原始数据

【例】请使用python检查df数据中的重复值

关键技术:duplicated方法

利用该方法检测冗余的行或列,默认是判断全部列中的值是否全部重复,并返回布尔类型的结果,对于完全没有重复的行,返回值为False。对于有重复值的行,第一次出现重复的那一行返回False,其余返回True 。

df.duplicated()

【例】在上例对df数据检查出重复值得基础之上,如何利用Python对重复值进行删除

关键技术:drop_dupicates()方法

利用该方法去除冗余数据,即删除冗余得所有行,默认是判断全部列

df.drop_duplicates()

3.4异常值的检测与处理

1、检测异常值

关键技术: query方法和boxplot方法

【例】某公司得年度业务数据work.csv,数据形式如下所示,其中年度销售量应大于1000,请分别判断数据范围方法和箱型图方法检测数据中得异常值

首先使用pandas库中得query方法查询数据中是否有异常值,然后通过boxplot方法检测异常值

import pandas as pd
import matplotlib.pyplot as plt
df=pd.read_csv("地址",sep=",",encoding="gbk")
df.query("销售<1000")

2、处理异常值

(1)最常用得方式是删除

(2)将异常值当缺失值处理,以某个值填充

(3)将异常值当特殊情况进行分析,研究异常值出现的原因

【例】对于上述业务数据work.csv,若已经检测出异常值,请问在此基础上,如何删除异常值

关键技术:drop()方法

import pandas as pd
import matplotlib.pyplot as plt
df=pd.read_csv("地址",sep=",",encoding"gbk")
df.query("销售<1000")
df1=df.drop(indx=3,axis=0)
df1
#删除异常值所在行
df1=df.drop(index=3,axis=0)
df1
#箱型图展示删除异常值后的数据
plt.boxplot(df1['销售'])

3.5数据类型转换

1、数据类型检查

【例】利用numpy库的arrange方法创建一维整数数组,并查看数据类型

关键技术:dfype属性

首先使用arrange方法创建数组arr,然后通过打印arr数组的dtype属性查看数据类型

import numpy as np
#创建一维数组
arrl=np.arrange(1,10,2)
arr1
#打印arr1的数据类型
print(arr1.dtype)

arr2=np.arrange(0,1,0.2)
arr2
#打印arr2的数据类型
print(arr2.dtype)

【例】利用numpy库的arrange方法创建一维浮点型数组arr1,然后将arr1数组的数据类型转换为整型

关键技术:astype函数

arr=np.arange(1,5,0.5)#创建数组
arr#打印数组
print(arr.dtype)#打印显示数据类型为浮点型
arr1=arr.astype(np.int)#使用该函数将其转换成整型
arr1#打印转换后的数组
print(arr1.dtype)#打印新数组的数据类型为整型

3.6索引设置

索引能够快速查询数据,本节主要介绍索引的应用,索引的作用相当于图书的目录,可根据目录中的页码快速的找到所需的内容,Pandas库中索引的作用如下

(1)更方便的查询数据

(2)使用索引可以提升查询性能

1、添加索引

【例】创建数据为[1,2,3,4,5]的Series,并指定索引标签为[‘a’,‘b’,‘c’,‘d’,‘e’]

关键技术:index方法设置索引

import pandas as pd
#创建series
s=pd.Series([1,2,3,4,5],index=['a','b','c','d','e'])
print(s)
a    1
b    2
c    3
d    4
e    5
dtype: int64

2、更改索引

【例】设定日期为索引

关键技术:set_index()函数,可以指定某一字段为索引

#导入work.csv文件
df=pd.read_csv("地址",sep=",",encoding="gbk")
#打印数据
print(df)
#重置df的索引为'日期'列
df1=df.set_index('日期')
#打印重置索引后的数据
print(df1)

还可以在导入csv文件的过程中设置index_col参数重置索引,

df2=pd.read_csv("地址",sep=",",encoding="gbk",index_col='日期')
df2

3、重命名索引

【例】构建series对象,其数据为[88,60,75],对应的索引为[1,2,3]。请利用Python对该series对象重新设置索引为[1,2,3,4,5]

关键技术:reindex方法

s2=s1.reindex([1,2,3,4,5])
print(s2)

重置行索引和列索引

关键技术:reindex()方法中的index参数和columns参数

import pandas as pd
data=[[][][]]
index=['''''']
columns=['''''']
df=pd.DataFrame(data=data,index=index,columns=columns)
print(df)
#重置行索引和列索引
df.reindex(index=['''''''],columns=['''''])

3.7其他

1、大小写转换

lower()方法:将字符串中所有的大写字母转换成小写字母

upper()方法:将字符串中的所有小写字母转换成大写字母

2、数据的修改与替换

【例】最后增加一列数据,要求数据的列索引为’four’,数值为[9,10,24]。在该数据的两列之间增加新的列,该如何操作

关键技术:insert方法

#方法一:直接对df进行赋值操作
df1=df
df1['four']=[9,10,24]
df1
#方法二:使用loc属性,向df的最后增加一列
df2=df
df2.loc[:,'four']=[9,10,24]
df2
#在第二列和第三列之间插入列
#使用insert方法
df.insert(2,'four',[9,10,24])
df
#按行增加数据loc方法
df.loc['d']=[9,10,11]
df
#增加多行用append方法
data_insert=
index_insert=
columns_insert=
sd_insert=pd.DataFrame(data=data_insert,index=index_insert,columns=columns_insert)
df2=df.append(df_insert)
df2

将第三行数据替换成[10,20,30]

关键技术:loc方法和iloc方法

3、数据删除

【例】构建DF数据,并删除下面DF实例的第四列数据

关键技术:drop()方法,删除数据中的额某一列

drop()方法的参数说明如下

labels:表示行标签或列标签

axis:axis=0,表示按行删除,axis=1表示按列删除

index:删除行,默认为None

columns:删除列,默认为None

inplace:可选参数,对原数组做出修改并返回一个新数组,默认是False,如果为True,那么原数组直接被替换

以上是关于数据预处理的主要内容,如果未能解决你的问题,请参考以下文章

K-近邻算法(KNN)

实验二 K-近邻算法及应用

任务7,深挖K近邻

MATLAB点云处理:kd树近邻搜索(K近邻 | 半径R近邻)

04_有监督学习--分类模型--K 近邻(kNN)

结合K近邻的改进密度峰值聚类算法总结