目录
一、熟悉数据
我们将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()缺省值的删除
对于缺省值,我们可以选择删除它,代码与结果如下:
x=df.dropna()#只要带有缺省值就整行删除
print(x)
y=df.dropna(how='all')#只删除整行是缺省值的行
print(y)
上面介绍了两条代码,第一条从其注释可知道,当某一行存在一个单元格的内容为缺省值,那么无论其他单元格是否为缺省值,该行整行都会被删除;第二条代码的不同之处即在括号中有how='all',该方法下,只有当某一行的所有单元格皆为缺省值时,才会将该行整行删除,否则不会删除该行。
作为对比,我将一个单元格的内容删除。
输出后的内容可以看到,王五所对应的识别码为NaN,这就表示该单元格无内容,是空的,即所说的缺省值。
首先输出的是dropna(how='all')的结果:
可以看到,当只有王五的识别码为缺省值时,并没有删除该行。
接下来输出dropna()的结果:
可以看到,王五那一行因为有一个缺省值,整行都被删除掉了。
2.1.3 fillna()缺省值的填充
对于缺省值,我们也可以选择对其进行填充。
为了对比,我删除了两个单元格的值。
输出结果可知,姓名一列于识别码一列共有两个缺省值。
x=df.fillna("好")#填缺省值,括号里写要填入的值
print(x)
y=df.fillna({'姓名':'王五','识别码':'103'})#指定列填入值,且可以多列填写,但都写在同一个字典里
print(y)
上面提供了两条代码,第一条代码表示将所有的缺省值都用“好”这个值填充,结果如下:
第二条代码为指定用某个值填充某一列的缺省部分,即将姓名一列的缺省部分都用“王五”填充,识别码一列的缺省部分都用“103”填充。结果如下:
2.2 重复值的处理
对于表单中出现的重复项,我们可以使用drop_duplicates()方法来保留其中一个。默认保留第一个值。
为了对比,将数据修改为以下形式:
可以看到,此时有两行的内容是相同的。
接下来使用所介绍的方法来解决重复项的问题,代码与结果如下:
x=df.drop_duplicates()#对所有值进行重复值判断,并且默认保留第一个(行)值
y=df.drop_duplicates(subset=['姓名','识别码'])#只针对某一列或某几列进行重复值删除的判断。
print(x)
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.rename(columns={'姓名':'name','时间':'time'})#只针对索引列重命名
y=df.rename(index={0:"零",1:"一"})#只针对索引行重命名
z=df.rename(columns={'姓名':'xingming','时间':'shijian'},index={0:"〇",1:"①"})#同时修改索引行和索引列
print(x)
print(y)
print(z)
上面的结果可以看出,索引行与索引列都分别修改成功,成为我所想要修改的名称。
2.4.4 重置索引
该部分主要是针对层次化的excel表格使用,相对而言较为繁琐,在这里暂时不过多讲述,仅仅对方法进行展示。
df.reset_index(level=None,drop=False,inplace=False)#常用于层次化索引,将行索引转为常规的列索引
#level参数用来指定第几级转化为列索引
#drop参数用来指定是否将原索引删掉
#inplace参数用来指定是否修改原数据表
由于本人在使用该方法时无法成功重置,因此暂时不对该方法进行详解,待之后找到原因再详细介绍该方法。
三、结语
本篇内容较多,但仍然是基于已有的表格进行的一些基础操作,后期介绍会逐步深入。若有错误还请指出。