前言
在数据科学和数据分析领域,Pandas是一个备受喜爱的Python库。它提供了丰富的数据结构和灵活的工具,帮助我们高效地处理和分析数据。其中,索引在Pandas中扮演着关键角色,它是一种强大的数据组织和访问机制,使我们能够更好地理解和操作数据。
本博客将探讨Pandas中与索引相关的核心知识点和常用操作。我们将了解如何设置和重置索引,通过索引来选择和过滤数据,以及如何利用多级索引来处理复杂的层次结构数据。
索引
当涉及Python或Pandas库中的索引时,通常指的是Pandas库中的DataFrame和Series对象的索引。这里只简单介绍一下索引,索引的具体用法均在其他操作中
案例数据表university_rank.csv
索引的设置
我们可以在读入数据的时候就通过pd.read_csv
相关属性来设置索引列,可以是单列也可以是多列,需要用列表来表达
读取时设置索引
pd.read_csv(
# 设置索引列
index_col = []
.....
....
)
In[0]:
python
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]:
python
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]:
python
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'>
| | | 大学名称 | 地区 | 学科领域 | 排名依据 |
| | 排名 | | | | |
| 0 | 1 | 哈佛大学 | 北美 | 工程 | 学术声誉 |
| 1 | 2 | 牛津大学 | 欧洲 | 医学 | 科研产出 |
| 2 | 3 | 北京大学 | 亚洲 | 商学 | 国际影响力 |
| 3 | 4 | 悉尼大学 | 大洋洲 | 计算机科学 | 教学质量 |
| 4 | 5 | 圣保罗大学 | 南美 | 艺术 | 学生满意度 |
| ... | ... | ... | ... | ... | ... |
| 95 | 96 | 圣保罗国立大学 | 南美 | 计算机科学 | 研究生录取率 |
| 96 | 97 | 约翰内斯堡大学 | 非洲 | 环境科学 | 学术声誉 |
| 97 | 98 | 麦吉尔大学 | 北美 | 艺术 | 学生满意度 |
| 98 | 99 | 伦敦政治经济学院 | 欧洲 | 法律 | 国际影响力 |
99 | 100 | 东京大学 | 亚洲 | 教育 | 毕业生就业率 |
---|
100 rows × 4 columns
上面这个例子就很明显的看出来append参数的作用,本来该DataFrame就有一个流水索引,后面又添加了一个排名索引并且append参数为True
但是我们发现打印出来是100 row * 4 columns ,所以排名变成索引后就不在作为一个列来存在了,我们可以使用drop参数来改变它
In[3]:
python
df = pd.read_csv("university_rank.csv")
df.set_index(keys=["排名"], append=True, inplace=True, drop=False) # 调整drop参数
df
out[3]:
| | | 大学名称 | 排名 | 地区 | 学科领域 | 排名依据 |
| | 排名 | | | | | |
| 0 | 1 | 哈佛大学 | 1 | 北美 | 工程 | 学术声誉 |
| 1 | 2 | 牛津大学 | 2 | 欧洲 | 医学 | 科研产出 |
| 2 | 3 | 北京大学 | 3 | 亚洲 | 商学 | 国际影响力 |
| 3 | 4 | 悉尼大学 | 4 | 大洋洲 | 计算机科学 | 教学质量 |
| 4 | 5 | 圣保罗大学 | 5 | 南美 | 艺术 | 学生满意度 |
| ... | ... | ... | ... | ... | ... | ... |
| 95 | 96 | 圣保罗国立大学 | 96 | 南美 | 计算机科学 | 研究生录取率 |
| 96 | 97 | 约翰内斯堡大学 | 97 | 非洲 | 环境科学 | 学术声誉 |
| 97 | 98 | 麦吉尔大学 | 98 | 北美 | 艺术 | 学生满意度 |
| 98 | 99 | 伦敦政治经济学院 | 99 | 欧洲 | 法律 | 国际影响力 |
99 | 100 | 东京大学 | 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]:
python
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]:
python
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]:
python
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]:
python
df.sort_index()
out[7]:
| | | 大学名称 | 排名 | 排名依据 |
| 学科领域 | 地区 | | | |
| 医学 | 亚洲 | 清华大学 | 34 | 学术声誉 |
| 医学 | 亚洲 | 清华大学 | 54 | 教学质量 |
| 医学 | 亚洲 | 清华大学 | 74 | 教学质量 |
| 医学 | 亚洲 | 清华大学 | 94 | 教学质量 |
| 医学 | 北美 | 麦吉尔大学 | 28 | 教学质量 |
| ... | ... | ... | ... | ... |
| 计算机科学 | 南美 | 里约热内卢大学 | 86 | 研究生录取率 |
| 计算机科学 | 南美 | 圣保罗国立大学 | 96 | 研究生录取率 |
| 计算机科学 | 大洋洲 | 悉尼大学 | 4 | 教学质量 |
| 计算机科学 | 大洋洲 | 墨尔本大学 | 14 | 学术声誉 |
计算机科学 | 大洋洲 | 奥克兰大学 | 24 | 教学质量 |
---|
100 rows × 3 columns
In[8]:
python
df.sort_index(level="地区")
out[8]:
| | | 大学名称 | 排名 | 排名依据 |
| 学科领域 | 地区 | | | |
| 医学 | 亚洲 | 清华大学 | 34 | 学术声誉 |
| 医学 | 亚洲 | 清华大学 | 54 | 教学质量 |
| 医学 | 亚洲 | 清华大学 | 74 | 教学质量 |
| 医学 | 亚洲 | 清华大学 | 94 | 教学质量 |
| 商学 | 亚洲 | 北京大学 | 3 | 国际影响力 |
| ... | ... | ... | ... | ... |
| 环境科学 | 非洲 | 约翰内斯堡大学 | 57 | 学术声誉 |
| 环境科学 | 非洲 | 约翰内斯堡大学 | 67 | 学术声誉 |
| 环境科学 | 非洲 | 约翰内斯堡大学 | 77 | 学术声誉 |
| 环境科学 | 非洲 | 约翰内斯堡大学 | 87 | 学术声誉 |
环境科学 | 非洲 | 约翰内斯堡大学 | 97 | 学术声誉 |
---|
100 rows × 3 columns
In[9]:
python
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]:
python
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]:
python
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
结束语
如果有疑问欢迎大家留言讨论,你如果觉得这篇文章对你有帮助可以给我一个免费的赞吗?我们之间的交流是我最大的动力!