Python数据分析从入门到精通
上QQ阅读APP看书,第一时间看更新

3.8 索引设置

索引能够快速查询数据,本节主要介绍索引的作用以及索引的应用。

3.8.1 索引的作用

索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。Pandas索引的作用如下。

 更方便查询数据。

 使用索引可以提升查询性能。

 如果索引是唯一的,Pandas会使用哈希表优化,查找数据的时间复杂度为O(1)。

 如果索引不是唯一的,但是有序,Pandas会使用二分查找算法,查找数据的时间复杂度为O(logN)。

 如果索引是完全随机的,那么每次查询都要扫描数据表,查找数据的时间复杂度为O(N)。

 自动的数据对齐功能,示意图如图3.49所示。

图3.49 自动数据对齐示意图

实现上述效果,程序代码如下:

01 import pandas as pd
02 s1 = pd.Series([10,20,30],index= list("abc"))
03 s2 = pd.Series([2,3,4],index=list("bcd"))
04 print(s1 + s2)

 强大的数据结构。

 基于分类数的索引,提升性能。

 多维索引,用于groupby多维聚合结果等。

 时间类型索引,强大的日期和时间的方法支持。

3.8.2 重新设置索引

Pandas有一个很重要的方法是reindex(),它的作用是创建一个适应新索引的新对象。语法如下:

DataFrame.reindex(labels = None,index = None,columns = None,axis = None,method = None,copy = True,level =
None,fill_value = nan,limit = None,tolerance = None)

常用参数说明:

 labels:标签,可以是数组,默认值为None(无)。

 index:行索引,默认值为None。

 columns:列索引,默认值为None。

 axis:轴,axis=0表示行,axis=1表示列。默认值为None。

 method:默认值为None,重新设置索引时,选择插值(一种填充缺失数据的方法)方法,其值可以是None、bfill/backfill(向后填充)、ffill/pad(向前填充)等。

 fill_value:缺失值要填充的数据。如缺失值不用NaN填充,而用0填充,则设置fill_value=0即可。

1.对Series对象重新设置索引

【示例41】 重新设置物理成绩的索引。(示例位置:资源包\MR\Code\03\41)

在3.2.3节已经建立了一组学生的物理成绩,下面重新设置索引,程序代码如下:

01 import pandas as pd
02 s1=pd.Series([88,60,75],index=[1,2,3])
03 print(s1)
04 print(s1.reindex([1,2,3,4,5]))

运行程序,控制台输出结果对比如图3.50和图3.51所示。

图3.50 原数据

图3.51 重新设置索引

从运行结果得知:reindex()方法根据新索引进行了重新排序,并且对缺失值自动填充NaN。如果不想用NaN填充,则可以为fill_value参数指定值,如0,主要代码如下:

s1.reindex([1,2,3,4,5],fill_value=0)

而对于一些有一定顺序的数据,我们可能需要插值(插值是一种填充缺失数据的方法)来填充缺失的数据,可以使用method参数。

【示例42】 向前和向后填充数据。(示例位置:资源包\MR\Code\03\42)

向前填充(和前面数据一样)、向后填充(和后面数据一样),主要代码如下:

01 print(s1.reindex([1,2,3,4,5],method='ffill'))   #向前填充
02 print(s1.reindex([1,2,3,4,5],method='bfill'))   #向后填充
2.对DataFrame对象重新设置索引

对于DataFrame对象,reindex()方法用于修改行索引和列索引。

【示例43】 创建成绩表并重新设置索引。(示例位置:资源包\MR\Code\03\43)

通过二维数组创建成绩表,程序代码如下:

通过reindex()方法重新设置行索引,主要代码如下:

df.reindex(['mr001','mr002','mr003','mr004','mr005'])

通过reindex()方法重新设置列索引,主要代码如下:

df.reindex(columns=['语文','物理','数学','英语'])

通过reindex()方法重新设置行索引和列索引,主要代码如下:

df.reindex(index=['mr001','mr002','mr003','mr004','mr005'],columns=['语文','物理','数学','英语'])

运行程序,控制台输出结果分别为原始数据(见图3.52)、重新设置行索引(见图3.53)、重新设置列索引(见图3.54)、重新设置行、列索引(见图3.55)。

图3.52 原始数据

图3.53 重新设置行索引

图3.54 重新设置列索引

图3.55 重新设置行、列索引

3.8.3 设置某列为行索引

设置某列为行索引主要使用set_index()方法。

【示例44】 设置“买家会员名”为行索引。(示例位置:资源包\MR\Code\03\44)

首先,导入“1月.xlsx”Excel文件,程序代码如下:

运行程序,输出结果如图3.56所示。

此时默认行索引为0、1、2、3、4,下面将“买家会员名”作为行索引,主要代码如下:

df2=df.set_index(['买家会员名'])

运行程序,输出结果如图3.57所示。

图3.56 1月淘宝销售数据(部分数据)

图3.57 设置“买家会员名”为索引

如果在set_index()方法中传入参数drop=True,则会删除“买家会员名”;如果传入drop=False,则会保留“买家会员名”。默认为False。

3.8.4 数据清洗后重新设置连续的行索引

在对Dataframe对象进行数据清洗后,例如去掉含NaN的行之后,发现行索引还是原来的行索引,对比效果如图3.58和图3.59所示。

图3.58 原数据

图3.59 数据清洗后还是原来的索引

【示例45】 删除数据后重新设置索引。(示例位置:资源包\MR\Code\03\45)

如果要重新设置索引可以使用reset_index()方法,在删除缺失数据后重新设置索引,主要代码如下:

df2=df.dropna().reset_index(drop=True)

运行程序,输出结果如图3.60所示。

图3.60 数据清洗后重新设置连续的行索引

另外,对于分组统计后的数据,有时也需要重新设置连续的行索引,方法同上。