pandas系列之索引

806 阅读7分钟

1.索引分类

索引是查找数据的依据,设置索引的目的是便于我们查找数据。

1.1普通索引

对dataframe数据结构而言,一般有两种索引。分别为普通索引和位置索引。

普通索引:其实就是名字,每一列数据都会有一个列名,每一行数据也可以设置一个行名

image-20210718124219510.png

如图,对行而言,普通索引就是指首列一、二、三、四、五的内容;对列而言,普通索引就是指首行区域、省份、城市、时间、指标、权重这一行的内容

1.2位置索引

顾名思义,即数据所处在第几行第几列。对应的数字减去1就是其索引(因为说第几行第几列是从1开始算,而索引从0开始,故而需要减去1.否则就会取错数据。这里要引起注意)

注:位置索引是自带的,而普通索引不一定会有。有时候需要认为进行设定。

2.索引设置

无索引表的内容如下:

image-20210718145600036.png

2.1 为无索引表添加索引

import pandas as pd
​
df = pd.read_excel(r'C:\Users\admin\Desktop\data_test.xlsx')
print("添加索引前:")
print(df)
df.index = ['一', '二', '三', '四']
df.columns = ['区域', '省份', '城市', '时间', '指标', '权重']
print("添加索引后:")
print(df)

result:

添加索引前:
   东北   辽宁  大连 2019-09-06 00:00:00  12  0.78
0  西北   广东  西安          2019-09-07  87  0.65
1  华南   北京  深圳          2019-09-08  87  0.34
2  华北   湖北  北京          2019-09-09  45  1.23
3  华中  黑龙江  武汉          2019-09-10  21  8.90
添加索引后:
   区域   省份  城市         时间  指标    权重
  西北   广东  西安 2019-09-07  87  0.65
  华南   北京  深圳 2019-09-08  87  0.34
  华北   湖北  北京 2019-09-09  45  1.23
  华中  黑龙江  武汉 2019-09-10  21  8.90

添加索引后的表格内容如下:

image-20210718145727730.png

2.2重新设置索引

重新设置索引,一般是指行索引的设置。虽然有的表有索引,但不是我们想要的索引。就需要重新进行设置。

2.2.1 设置单列索引

df = pd.read_excel(r'C:\Users\admin\Desktop\data_test.xlsx')
print("重新设置索引前:")
print(df)
df.set_index("城市")
print("重新设置索引后:")
print(df)

result:

重新设置索引前:
   区域   省份  城市         时间  指标    权重
0  西北   广东  西安 2019-09-07  87  0.65
1  华南   北京  深圳 2019-09-08  87  0.34
2  华北   湖北  北京 2019-09-09  45  1.23
3  华中  黑龙江  武汉 2019-09-10  21  8.90
重新设置索引后:
    区域   省份         时间  指标    权重
城市                              
西安  西北   广东 2019-09-07  87  0.65
深圳  华南   北京 2019-09-08  87  0.34
北京  华北   湖北 2019-09-09  45  1.23
武汉  华中  黑龙江 2019-09-10  21  8.90

set_index()传入你要设置为索引的列名即可将对应的列设置为索引。

2.2.2 设置多列索引

一个表中用多列来做索引的方式我们称之为层次化索引。

df = pd.read_excel(r'C:\Users\admin\Desktop\data_test.xlsx')
print("重新设置索引前:")
print(df)
print("重新设置索引后:")
print(df.set_index(["区域", "省份"]))

result:

重新设置索引前:
   区域   省份  城市         时间  指标    权重
0  西北   广东  西安 2019-09-07  87  0.65
1  华南   北京  深圳 2019-09-08  87  0.34
2  华北   湖北  北京 2019-09-09  45  1.23
3  华中  黑龙江  武汉 2019-09-10  21  8.90
重新设置索引后:
        城市         时间  指标    权重
区域 省份                          
西北 广东   西安 2019-09-07  87  0.65
华南 北京   深圳 2019-09-08  87  0.34
华北 湖北   北京 2019-09-09  45  1.23
华中 黑龙江  武汉 2019-09-10  21  8.90

2.3 索引的重命名

重命名索引时参数需要按照{原索引名: 新索引名}这样的字典形式传入。

df = pd.read_excel(r'C:\Users\admin\Desktop\data_test.xlsx')
print("重新命名索引前:")
print(df)
print("重新命名索引后:")
print(df.rename(columns={"区域": "地区", "省份": "省"}))

result:

重新命名索引前:
   区域   省份  城市         时间  指标    权重
0  西北   广东  西安 2019-09-07  87  0.65
1  华南   北京  深圳 2019-09-08  87  0.34
2  华北   湖北  北京 2019-09-09  45  1.23
3  华中  黑龙江  武汉 2019-09-10  21  8.90
重新命名索引后:
   地区      城市         时间  指标    权重
0  西北   广东  西安 2019-09-07  87  0.65
1  华南   北京  深圳 2019-09-08  87  0.34
2  华北   湖北  北京 2019-09-09  45  1.23
3  华中  黑龙江  武汉 2019-09-10  21  8.90

注:一般最常用到的就是列索引了,这里以列索引作为例子进行讲述。行索引的做法与其一致,只需要将columns改为index就可以了。

2.4索引重置

重置索引主要用在层次化索引表中,重置索引是将索引列当做columns进行返回

让我们先来看看索引重置前的情形:

import pandas as pd
​
df = pd.read_excel(r'C:\Users\admin\Desktop\data_test.xlsx')
df2 = df.set_index(["区域", "城市"])
print(df2)

result:

        省份         时间  指标    权重

区域 城市                          
西北 西安   广东 2019-09-07  87  0.65
华南 深圳   北京 2019-09-08  87  0.34
华北 北京   湖北 2019-09-09  45  1.23
华中 武汉  黑龙江 2019-09-10  21  8.90
print(df2.index)

result:

MultiIndex([('西北', '西安'),            ('华南', '深圳'),            ('华北', '北京'),            ('华中', '武汉')],
           names=['区域', '城市'])

可以看到,此时是一区域、城市这2列构成的层次索引。

索引重置主要利用了reset_index()方法,常用参数依次做如下说明:

level:用来指定要将层次化为索引的第几级别转化为columns。在层次化索引(也就是一个表有多个索引)中,第一个索引为0级,第二个为1级,其他依次类推。该参数默认将全部索引转化为columns。

drop:用来指定是否将索引删掉,即不作为一个新的columns,默认为False,即不删除原索引。

inplace:用来指定是否修改原数据表。

下面一一距离说明这几个参数的效果:

2.4.1 level参数

(1) 默认情形

df = pd.read_excel(r'C:\Users\admin\Desktop\data_test.xlsx')
df2 = df.set_index(["区域", "城市"])
print(df2.reset_index())

result:

   区域  城市   省份         时间  指标    权重
0  西北  西安   广东 2019-09-07  87  0.65
1  华南  深圳   北京 2019-09-08  87  0.34
2  华北  北京   湖北 2019-09-09  45  1.23
3  华中  武汉  黑龙江 2019-09-10  21  8.90
print(df2.reset_index().index)

result:

RangeIndex(start=0, stop=4, step=1)

通过和重置索引签的对比,可以看到。索引重置后默认恢复到初始情形。即人为设置索引统统被删除。

(2) 指定值

df = pd.read_excel(r'C:\Users\admin\Desktop\data_test.xlsx')
df2 = df.set_index(["区域", "城市"])
print(df2.reset_index(level=0))

result:

    区域   省份         时间  指标    权重

城市                              
西安  西北   广东 2019-09-07  87  0.65
深圳  华南   北京 2019-09-08  87  0.34
北京  华北   湖北 2019-09-09  45  1.23
武汉  华中  黑龙江 2019-09-10  21  8.90
print(df2.reset_index(level=0).index)

result:

Index(['西安', '深圳', '北京', '武汉'], dtype='object', name='城市')

和默认情形相比较,可以看到这里已经将区域这个索引给删除了。只留下了城市这一个索引。因此这个参数可以理解为存在多个索引时,你要删除哪个索引就将其值设置为数目减去1就好。比如我要删除第3个索引,那么这里level参数的值就是2了。

2.4.2 drop参数

df = pd.read_excel(r'C:\Users\admin\Desktop\data_test.xlsx')
df2 = df.set_index(["区域", "城市"])
print(df2.reset_index(drop=True))

result:

    省份         时间  指标    权重
0   广东 2019-09-07  87  0.65
1   北京 2019-09-08  87  0.34
2   湖北 2019-09-09  45  1.23
3  黑龙江 2019-09-10  21  8.90

此时区域、城市这2列作为索引已经被删除了,所以打印出来的结果中缺失了这2列。