
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 数据清洗后重新设置连续的行索引
另外,对于分组统计后的数据,有时也需要重新设置连续的行索引,方法同上。