使用Python对EXCEL数据的预处理
一、熟悉数据
我们将EXCEL中的数据导入之后,需要对数据进行大致性的了解,当对数据充分地了解之后,才便于后期的分析工作。
该部分涉及到四个基本方法,分别为“shape”“info”“head”“describe”。下面会具体介绍四者的用法与功能。
以下是我准备好的一组简单的excel数据:
其中:“编号”“姓名”“识别码”“时间”称为索引列;左边的“1”“2”···“6”称为索引行。
通过第一篇的方法,将数据导入python中。代码与输出结果如下所示:
import pandas as pd df=pd.read_excel(r"D:\杂货\新编码.xlsx",sheet_name='Sheet1') print(df)
此部分不再详述,请见第一篇。
1.1 shape
在导入excel表格数据后,使用该方法可以查看该表格的数据一共有多少行多少列,并以元组的形式输出。需要表明的是,该方法输出的行数和列数不包括索引行和索引列。
代码与输出结果如下:
m=df.shape#输出导入的列表有多少行多少列 print(m)
最下面的(5,4)即为该方法输出的结果,解释为5行4列。
1.2 info
该方法可以帮助我们查看所导入的每一列的数据类型,并且还能查看是否有缺省值。
代码与结果如下:
import pandas as pd df=pd.read_excel(r"D:\杂货\新编码.xlsx",sheet_name='Sheet1') df.info()#查看每一列的数据类型
从输出结果可以看到,Column一列显示为头部的名称,即为我们的索引列;Non-Null Count一列表示该列有几个非缺省值,5 non-null表示该列中的每一个单元格都有内容填入,没有缺省值;Dtype一列则为每一列的数据类型,分别为object,int64,datetime64[ns]类型。
1.3 head
该方法能够帮助我们预览表格的前几行的内容。
形式为:head()需要预览前面几行就在括号里填数字几。
代码与结果如下:
import pandas as pd df=pd.read_excel(r"D:\杂货\新编码.xlsx",sheet_name='Sheet1') n=df.head(1)#可选择预览前几行 k=df.head(2) j=df.head(3) print(n) print(k) print(j)
以上分别输出了前1行,前2行,前3行。
1.4 describe
该方法能够帮助我们查看某一列int64类型数据的个数、平均数、标准差、最大值、最小值、分位数。
代码与结果如下:
import pandas as pd df=pd.read_excel(r"D:\杂货\新编码.xlsx",sheet_name='Sheet1') i=df.describe()#可查看数据的基本情况,int64类型的数据 print(i)
由于只有“识别码”一列的数据为int64类型的数据,因此该方法最终输出的结果只有识别码的结果。
二、数据预处理
2.1 缺省值的处理
2.1.1 isnull()检查缺省值
首先我们要查看我们的数据里是否含有缺省值。在1.2部分已经介绍了使用info()方法查看缺省值,以下将介绍另一个检查缺省值的方法。代码与结果如下:
n=df.isnull()#true为缺省值print(n)
可以看到,False表示该单元格不是缺省值,若该单元格为缺省值,则结果会显示为True。
2.1.2 dropna()缺省值的删除
对于缺省值,我们可以选择删除它,代码与结果如下:
n=df.isnull()#true为缺省值 print(n)
上面介绍了两条代码,第一条从其注释可知道,当某一行存在一个单元格的内容为缺省值,那么无论其他单元格是否为缺省值,该行整行都会被删除;第二条代码的不同之处即在括号中有how='all',该方法下,只有当某一行的所有单元格皆为缺省值时,才会将该行整行删除,否则不会删除该行。
作为对比,我将一个单元格的内容删除。
输出后的内容可以看到,王五所对应的识别码为NaN,这就表示该单元格无内容,是空的,即所说的缺省值。
首先输出的是dropna(how='all')的结果:
可以看到,当只有王五的识别码为缺省值时,并没有删除该行。
接下来输出dropna()的结果:
可以看到,王五那一行因为有一个缺省值,整行都被删除掉了。
2.1.3 fillna()缺省值的填充
对于缺省值,我们也可以选择对其进行填充。
为了对比,我删除了两个单元格的值。
输出结果可知,姓名一列于识别码一列共有两个缺省值。
x=df.dropna()#只要带有缺省值就整行删除 print(x) y=df.dropna(how='all')#只删除整行是缺省值的行 print(y)
上面提供了两条代码,第一条代码表示将所有的缺省值都用“好”这个值填充,结果如下:
第二条代码为指定用某个值填充某一列的缺省部分,即将姓名一列的缺省部分都用“王五”填充,识别码一列的缺省部分都用“103”填充。结果如下:
2.2 重复值的处理
对于表单中出现的重复项,我们可以使用drop_duplicates()方法来保留其中一个。默认保留第一个值。
为了对比,将数据修改为以下形式:
可以看到,此时有两行的内容是相同的。
接下来使用所介绍的方法来解决重复项的问题,代码与结果如下:
x=df.fillna("好")#填缺省值,括号里写要填入的值 print(x) y=df.fillna({'姓名':'王五','识别码':'103'})#指定列填入值,且可以多列填写,但都写在同一个字典里 print(y)
首先来看代码的第一行,该方法的作用在其注释处已经说明,不再赘述,从其输出结果看,索引行为“3”的那一行“王五”重复项被删除了,只保留了索引行为“2”的那一行“王五”。
接着看第二行代码的结果:
其输出的结果其实和第一种是一样的,虽然结果一样,但是两者的目的是不一样的,第二行代码括号中写入了一个列表['姓名','识别码'],该列表达到的作用就是指明我们要删除的哪一列中存在的重复项,即是说:我想将“姓名”一列中的重复项和“识别码”一列中的重复项进行处理。在此我以两个列名作为示例,若只想按照一个列名来删除重复项的,则只需写入一个列名即可。
2.3 数据类型的转换
2.3.1 数据类型的查看
在前面已经介绍了使用info()方法查看数据类型,在此再介绍一种方法,代码与结果如下:
x=df['姓名'].dtype#针对查看某一列的数据类型print(x)
该方法是只能查看某一列的数据类型,只能查看一列,不能查看多列。只需将想查看的那一列的索引列名称写入中括号即可。最后输出结果可以看到“姓名”一列的数据类型为object。
2.3.2 数据类型的转换
这里我们使用的方法为astype()方法,首先查看原始数据中“识别码”的数据类型。
可以看到其数据类型为int64。
接下来我们来修改该列的数据类型为float64,代码与结果如下:
y=df['识别码'].astype('float64')print(y)
可以看到输出结果中识别码一列的数据有了小数点后一位,且其dtype显示为float64。
2.4 索引的设置
2.4.1 添加索引
索引的添加很简单,以下是索引列的添加(修改)代码与结果如下:
df.columns=['号编','名姓','码别识','间时']print(df)
可以看到,最上面的索引列名称被我替换掉了。
以下是索引行的添加(修改)。
df.index=['2','4','6','8','10']print(df)
可以看到,最左边的索引行名称被我改成了2,4,6,8,10。
需要注意的是,有多少行多少列就要添加多少行多少列的索引,不然会报错。
2.4.2 重新设置索引
我们还可以使用列表中的某一列数据作为索引。方法是set_index()。
代码与结果如下:
x=df.set_index("姓名")print(x)
从结果可以看出,最左边的索引不再是数字,而成了姓名。
2.4.3 索引的重命名
针对重命名索引,有以下三种写法:
df.rename(columns={"原来的索引":"想要修改成的索引"}) 该方法只修改索引列的名称
df.rename(index={"原来的索引":"想要修改成的索引"}) 该方法只修改索引行的名称
df.rename(columns={"原来的索引":"想要修改成的索引"},index={"原来的索引":"想要修改成的索引"}) 该方法能同时修改索引列和索引行的名称
需要注意:该方法都使用了列表。代码与结果如下:
x=df.drop_duplicates()#对所有值进行重复值判断,并且默认保留第一个(行)值 y=df.drop_duplicates(subset=['姓名','识别码'])#只针对某一列或某几列进行重复值删除的判断。 print(x) print(y)
上面的结果可以看出,索引行与索引列都分别修改成功,成为我所想要修改的名称。
2.4.4 重置索引
该部分主要是针对层次化的excel表格使用,相对而言较为繁琐,在这里暂时不过多讲述,仅仅对方法进行展示。
x=df['姓名'].dtype#针对查看某一列的数据类型 print(x)
由于本人在使用该方法时无法成功重置,因此暂时不对该方法进行详解,待之后找到原因再详细介绍该方法。
三、结语
本篇内容较多,但仍然是基于已有的表格进行的一些基础操作,后期介绍会逐步深入。若有错误还请指出。
到此这篇关于使用Python处理EXCEL基础操作篇2Python对EXCEL数据的预处理的文章就介绍到这了,更多相关Python对EXCEL数据预处理内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!