数据预处理
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]:
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 |
print("当整列都为NaN时,删除整列")
df.dropna(how='all',axis=1)
当整列都为NaN时,删除整列
Out[5]:
item1 | item2 | item3 | item4 | item5 | |
---|---|---|---|---|---|
0 | NaN | 1.0 | 1.0 | 1.0 | 1.0 |
1 | 2.0 | 2.0 | NaN | 2.0 | 2.0 |
2 | 3.0 | 3.0 | 3.0 | NaN | 3.0 |
3 | 4.0 | 4.0 | 4.0 | NaN | NaN |
4 | NaN | NaN | NaN | NaN | NaN |
【例】当某行有一个数据为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,那么原数组直接被替换
以上是关于数据预处理的主要内容,如果未能解决你的问题,请参考以下文章