Bootstrap

【Python】数据分析+数据挖掘——探索Pandas中的索引与数据组织

前言

在数据科学和数据分析领域,Pandas是一个备受喜爱的Python库。它提供了丰富的数据结构和灵活的工具,帮助我们高效地处理和分析数据。其中,索引在Pandas中扮演着关键角色,它是一种强大的数据组织和访问机制,使我们能够更好地理解和操作数据。

本博客将探讨Pandas中与索引相关的核心知识点和常用操作。我们将了解如何设置和重置索引,通过索引来选择和过滤数据,以及如何利用多级索引来处理复杂的层次结构数据。


索引

当涉及Python或Pandas库中的索引时,通常指的是Pandas库中的DataFrame和Series对象的索引。这里只简单介绍一下索引,索引的具体用法均在其他操作中

案例数据表university_rank.csv

在这里插入图片描述

索引的设置

我们可以在读入数据的时候就通过pd.read_csv相关属性来设置索引列,可以是单列也可以是多列,需要用列表来表达

读取时设置索引
pd.read_csv(
    # 设置索引列
    index_col = []
    .....
    ....
)

In[0]:

df = pd.read_csv("university_rank.csv", index_col=["大学名称"])
df

out[0]:

排名地区学科领域排名依据
大学名称
哈佛大学1北美工程学术声誉
牛津大学2欧洲医学科研产出
北京大学3亚洲商学国际影响力
悉尼大学4大洋洲计算机科学教学质量
圣保罗大学5南美艺术学生满意度
...............
圣保罗国立大学96南美计算机科学研究生录取率
约翰内斯堡大学97非洲环境科学学术声誉
麦吉尔大学98北美艺术学生满意度
伦敦政治经济学院99欧洲法律国际影响力
东京大学100亚洲教育毕业生就业率

100 rows × 4 columns

如果我想要设置多个变量列作为索引呢?

In[1]:

df = pd.read_csv("university_rank.csv", index_col=["地区", "学科领域"]) # 设置多个变量列作为索引
df

out[1]:

大学名称排名排名依据
地区学科领域
北美工程哈佛大学1学术声誉
欧洲医学牛津大学2科研产出
亚洲商学北京大学3国际影响力
大洋洲计算机科学悉尼大学4教学质量
南美艺术圣保罗大学5学生满意度
............
计算机科学圣保罗国立大学96研究生录取率
非洲环境科学约翰内斯堡大学97学术声誉
北美艺术麦吉尔大学98学生满意度
欧洲法律伦敦政治经济学院99国际影响力
亚洲教育东京大学100毕业生就业率

100 rows × 3 columns

DataFrame.set_index方法设置索引

除此之外也可以使用DataFrame类型数据自带的df.set_index方法

df.set_index(
    # 索引列名,需要使用list类型
    key
    # 建立索引后是否删除该列
    drop = True
    # 是否在原索引上添加索引
    append = False
    # 是否直接修改原df
    inplace = False
    # 默认为False,如果为True,则检查新的索引是否唯一,如果有重复则会抛出ValueError
    verify_integrity = False
)

In[2]:

df = pd.read_csv("university_rank.csv")
df.set_index(keys=["排名"], append=True, inplace=True)
print(type(df)) # 查看df类型
df

out[2]:

<class 'pandas.core.frame.DataFrame'>
大学名称地区学科领域排名依据
排名
01哈佛大学北美工程学术声誉
12牛津大学欧洲医学科研产出
23北京大学亚洲商学国际影响力
34悉尼大学大洋洲计算机科学教学质量
45圣保罗大学南美艺术学生满意度
..................
9596圣保罗国立大学南美计算机科学研究生录取率
9697约翰内斯堡大学非洲环境科学学术声誉
9798麦吉尔大学北美艺术学生满意度
9899伦敦政治经济学院欧洲法律国际影响力
99100东京大学亚洲教育毕业生就业率

100 rows × 4 columns

上面这个例子就很明显的看出来append参数的作用,本来该DataFrame就有一个流水索引,后面又添加了一个排名索引并且append参数为True
但是我们发现打印出来是100 row * 4 columns所以排名变成索引后就不在作为一个列来存在了,我们可以使用drop参数来改变它

In[3]:

df = pd.read_csv("university_rank.csv")
df.set_index(keys=["排名"], append=True, inplace=True, drop=False) # 调整drop参数
df

out[3]:

大学名称排名地区学科领域排名依据
排名
01哈佛大学1北美工程学术声誉
12牛津大学2欧洲医学科研产出
23北京大学3亚洲商学国际影响力
34悉尼大学4大洋洲计算机科学教学质量
45圣保罗大学5南美艺术学生满意度
.....................
9596圣保罗国立大学96南美计算机科学研究生录取率
9697约翰内斯堡大学97非洲环境科学学术声誉
9798麦吉尔大学98北美艺术学生满意度
9899伦敦政治经济学院99欧洲法律国际影响力
99100东京大学100亚洲教育毕业生就业率

100 rows × 5 columns

取消set_index索引设置

那么我们该如何还原呢,答案就是使用df.reset_index

df.reset_index()是Pandas DataFrame对象的一个方法,它用于重置(恢复)DataFrame的索引,将整数序列作为新的行索引,并将原来的行索引(可能是整数、字符串或其他类型)转换为DataFrame的列。

df.reset_index(
    # 是否将索引列删除,而不还原
    drop = Flase
    # 是否修改原df
    inplace = False
    #  可选参数,用于指定要重置的索引级别。如果不指定,则会重置所有的索引级别
    level
    # 如果DataFrame具有多级列索引,该参数用于指定要重置的列级别。默认为0,即第一级
	col_level
	# 如果指定了col_level,则可以使用该参数为重置的列索引命名
	col_fill
)

In[4]:

df.reset_index(drop=True, inplace=True)
df
大学名称排名地区学科领域排名依据
0哈佛大学1北美工程学术声誉
1牛津大学2欧洲医学科研产出
2北京大学3亚洲商学国际影响力
3悉尼大学4大洋洲计算机科学教学质量
4圣保罗大学5南美艺术学生满意度
..................
95圣保罗国立大学96南美计算机科学研究生录取率
96约翰内斯堡大学97非洲环境科学学术声誉
97麦吉尔大学98北美艺术学生满意度
98伦敦政治经济学院99欧洲法律国际影响力
99东京大学100亚洲教育毕业生就业率

100 rows × 5 columns

DataFrame.index.name修改索引名称

此外我们也可以使用df.index.names来修改索引的名称

In[5]:

df.index.names = ["ID"] # df是案例数据表,设置索引名称为ID
df

out[5]:

大学名称排名地区学科领域排名依据
ID
0哈佛大学1北美工程学术声誉
1牛津大学2欧洲医学科研产出
2北京大学3亚洲商学国际影响力
3悉尼大学4大洋洲计算机科学教学质量
4圣保罗大学5南美艺术学生满意度
..................
95圣保罗国立大学96南美计算机科学研究生录取率
96约翰内斯堡大学97非洲环境科学学术声誉
97麦吉尔大学98北美艺术学生满意度
98伦敦政治经济学院99欧洲法律国际影响力
99东京大学100亚洲教育毕业生就业率

100 rows × 5 columns


索引的排序

建立完索引后我们可以根据索引来进行排序,具体使用的方法是df.sort_index()

DataFrame.sort_index索引排序

df.sort_index()是Pandas DataFrame对象的一个方法,用于按照索引(行标签)对DataFrame进行排序。它可以根据行索引的标签值进行升序或降序排序。

df.sort_index(
    # 多重索引时的优先级
    level
    # 是否为升序
    ascending = True
    # 是否在原df修改
    inplace = False
    # 缺失值的排列顺序,可选值有 'first' 和 'last',默认为 'last',表示NaN在排序后放在最后。
    na_position = 'last'
    # 是否按索引排序后丢弃索引,默认为False,如果为True,则在排序后重置行索引为从0开始的连续整数索引
    ignore_index = False
    # 默认为0,表示按照行索引排序。如果设置为1,则按列索引排序(对于多级索引的DataFrame)
    axis = 0
	# 排序算法的种类。可选值有 'quicksort'、'mergesort'、'heapsort',默认为 'quicksort'
	kind = 'quicksort'
	# 默认为True,如果在排序时有未指定的级别或索引,则对其进行排序。如果设置为False,则保持原样
	sort_remaining = True
    # 1.1.0新增属性,可以对索引值进行函数修改
    key
)

In[6]:

df = pd.read_csv("university_rank.csv", index_col=["学科领域", "地区"])
df

out[6]:

大学名称排名排名依据
学科领域地区
工程北美哈佛大学1学术声誉
医学欧洲牛津大学2科研产出
商学亚洲北京大学3国际影响力
计算机科学大洋洲悉尼大学4教学质量
艺术南美圣保罗大学5学生满意度
...............
计算机科学南美圣保罗国立大学96研究生录取率
环境科学非洲约翰内斯堡大学97学术声誉
艺术北美麦吉尔大学98学生满意度
法律欧洲伦敦政治经济学院99国际影响力
教育亚洲东京大学100毕业生就业率

100 rows × 3 columns

In[7]:

df.sort_index()

out[7]:

大学名称排名排名依据
学科领域地区
医学亚洲清华大学34学术声誉
亚洲清华大学54教学质量
亚洲清华大学74教学质量
亚洲清华大学94教学质量
北美麦吉尔大学28教学质量
...............
计算机科学南美里约热内卢大学86研究生录取率
南美圣保罗国立大学96研究生录取率
大洋洲悉尼大学4教学质量
大洋洲墨尔本大学14学术声誉
大洋洲奥克兰大学24教学质量

100 rows × 3 columns

In[8]:

df.sort_index(level="地区")

out[8]:

大学名称排名排名依据
学科领域地区
医学亚洲清华大学34学术声誉
亚洲清华大学54教学质量
亚洲清华大学74教学质量
亚洲清华大学94教学质量
商学亚洲北京大学3国际影响力
...............
环境科学非洲约翰内斯堡大学57学术声誉
非洲约翰内斯堡大学67学术声誉
非洲约翰内斯堡大学77学术声誉
非洲约翰内斯堡大学87学术声誉
非洲约翰内斯堡大学97学术声誉

100 rows × 3 columns

In[9]:

df.sort_index(level="地区", ignore_index=True)

out[9]:

大学名称排名排名依据
0清华大学34学术声誉
1清华大学54教学质量
2清华大学74教学质量
3清华大学94教学质量
4北京大学3国际影响力
............
95约翰内斯堡大学57学术声誉
96约翰内斯堡大学67学术声誉
97约翰内斯堡大学77学术声誉
98约翰内斯堡大学87学术声誉
99约翰内斯堡大学97学术声誉

100 rows × 3 columns

DataFrame.sort_values变量列排序

如果我想要按照变量来排序呢,而不是索引?df.sort_values可以帮到你

df.sort_values(
    # 用于指定排序的列名或列名列表。可以传入单个列名的字符串,也可以传入一个包含多个列名的列表,表示按照这些列的值进行排序
    by
    # 默认为0,表示按照行进行排序。如果设置为1,则按列进行排序
    axis = 0
    # 默认为True,表示升序排序。如果设置为False,表示降序排序
    ascending = True
    # 默认为False,是否在原df上修改
    inplace = False
    # 指定缺失值(NaN)在排序后的位置。可选值有 'first' 和 'last',默认为 'last',表示NaN在排序后放在最后
    na_position = 'last'
    # 默认为False,如果为True,则在排序后重置行索引为从0开始的连续整数索引
    ignore_index = False
)

In[10]:

data = {
    'ID': [4, 2, 1, 3],
    'Name': ['David', 'Bob', 'Alice', 'Charlie'],
    'Age': [40, 30, 25, 35]
}

df = pd.DataFrame(data)
print(df)

out[10]:

   ID     Name  Age
2   1    Alice   25
1   2      Bob   30
3   3  Charlie   35
0   4    David   40

现在,我们按照’Age’列进行升序排序

In[11]:

df_sorted = df.sort_values(by='Age')
print(df_sorted)

out[11]:

   ID     Name  Age
2   1    Alice   25
1   2      Bob   30
3   3  Charlie   35
0   4    David   40

结束语

如果有疑问欢迎大家留言讨论,你如果觉得这篇文章对你有帮助可以给我一个免费的赞吗?我们之间的交流是我最大的动力!

;