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

前言

在数据科学和数据分析领域,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

结束语

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

相关推荐
明月清风徐徐9 分钟前
Scrapy爬取豆瓣电影Top250排行榜
python·selenium·scrapy
theLuckyLong10 分钟前
SpringBoot后端解决跨域问题
spring boot·后端·python
Yongqiang Cheng13 分钟前
Python operator.itemgetter(item) and operator.itemgetter(*items)
python·operator·itemgetter
MavenTalk16 分钟前
Move开发语言在区块链的开发与应用
开发语言·python·rust·区块链·solidity·move
FksLiao28 分钟前
Superset安装
python
L Jiawen35 分钟前
【Python · PyTorch】卷积神经网络(基础概念)
pytorch·python·cnn
goomind40 分钟前
深度学习模型评价指标介绍
人工智能·python·深度学习·计算机视觉
->yjy1 小时前
wordcloud库基本介绍
python
2401_840192271 小时前
python基础大杂烩
linux·开发语言·python
abments1 小时前
JavaScript逆向爬虫教程-------基础篇之常用的编码与加密介绍(python和js实现)
javascript·爬虫·python