【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

结束语

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/50974.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【JavaWeb】正则表达式

&#x1f384;欢迎来到边境矢梦的csdn博文&#xff0c;本文主要讲解Java 中正则表达式 的相关知识&#x1f384; &#x1f308;我是边境矢梦&#xff0c;一个正在为秋招和算法竞赛做准备的学生&#x1f308; &#x1f386;喜欢的朋友可以关注一下&#x1faf0;&#x1faf0;&am…

spring启动流程 (6完结) springmvc启动流程

SpringMVC的启动入口在SpringServletContainerInitializer类&#xff0c;它是ServletContainerInitializer实现类(Servlet3.0新特性)。在实现方法中使用WebApplicationInitializer创建ApplicationContext、创建注册DispatcherServlet、初始化ApplicationContext等。 SpringMVC…

Selenium多浏览器处理

Python 版本 #导入依赖 import os from selenium import webdriverdef test_browser():#使用os模块的getenv方法来获取声明环境变量browserbrowser os.getenv("browser").lower()#判断browser的值if browser "headless":driver webdriver.PhantomJS()e…

【多模态】19、RegionCLIP | 基于 Region 来实现视觉语言模型预训练

文章目录 一、背景二、方法2.1 Region-based Language-Image Pretraining2.2 目标检测的迁移学习 三、效果3.1 数据集3.2 实现细节3.3 结果 论文&#xff1a; RegionCLIP: Region-based Language-Image Pretraining 代码&#xff1a;https://github.com/microsoft/RegionCLIP …

手写线程池 - C++版 - 笔记总结

1.线程池原理 创建一个线程&#xff0c;实现很方便。 缺点&#xff1a;若并发的线程数量很多&#xff0c;并且每个线程都是执行一个时间较短的任务就结束了。 由于频繁的创建线程和销毁线程需要时间&#xff0c;这样的频繁创建线程会大大降低 系统的效率。 2.思考 …

Maven基础之项目创建、packaging

文章目录 创建 maven 项目流程骨架是浮云&#xff0c;packaging 是关键 创建 maven 项目流程 通过骨架&#xff08;archetype&#xff09;创建 maven 工程 第一步&#xff1a;选择 new → maven → Maven Project 第二步&#xff1a;New Maven Project 窗口不作任何设置&…

Zabbix监控ActiveMQ

当我们在线上使用了ActiveMQ 后&#xff0c;我们需要对一些参数进行监控&#xff0c;比如 消息是否有阻塞&#xff0c;哪个消息队列阻塞了&#xff0c;总的消息数是多少等等。下面我们就通过 Zabbix 结合 Python 脚本来实现对 ActiveMQ的监控。 一、创建 Activemq Python 监控…

Java 异常处理的使用和思考

概念 异常处理的概念起源于早期的编程语言&#xff0c;如 LISP、PL/I 和 CLU。这些编程语言首次引入了异常处理机制&#xff0c;以便在程序执行过程中检测和处理错误情况。异常处理机制随后在 Ada、Modula-3、C、Python、Java 等编程语言中得到了广泛采用和发展。在 Java 中&a…

Unity Addressable

Unity重要目录 工程中的几个重要目录 Assets存放资源、代码、配置Library大部分的资源导入到Assets目录之后&#xff0c;会转化成Unity认可的文件&#xff0c;转化后的文件会存储在这个目录Logs日志文件Packages第三方插件ProjectSettings存放各种项目设定UserSettings用户偏好…

基于Truss+Docker+Kubernetes把开源模型Falcon-7B送上云端(译)

背景 到目前为止&#xff0c;我们已经看到了ChatGPT的能力及其所能提供的强大功能。然而&#xff0c;对于企业应用来说&#xff0c;像ChatGPT这样的封闭源代码模型可能会带来风险&#xff0c;因为企业自身无法控制他们的数据。尽管OpenAI公司声称用户数据不会被存储或用于训练…

python 将pdf文件转图片

有小伙伴问了怎么将 pdf文件转图片的问题&#xff0c;我百度了一波儿&#xff0c;搞了以下python代码给他封装成exe工具了。 中途打包踩了个坑&#xff0c;python进程池的问题&#xff0c;本地运行没啥问题&#xff0c;打包好的exe文件双击就会使电脑内存爆破卡死&#xff0c;…

缩略所写的代码

有一长串的代码需要进行缩略 可以在要缩略的代码的前一行加上注释。并在其中写上 #region。 在最后一行的下一行加上注释&#xff0c;并在其中写上 #endregion。 最终结果&#xff1a;

神经数据库:用于使用 ChatGPT 构建专用 AI 代理的下一代上下文检索系统 — (第 2/3 部分)

书接上回理解构建LLM驱动的聊天机器人时的向量数据库检索的局限性 - &#xff08;第1/3部分&#xff09;_阿尔法旺旺的博客-CSDN博客 其中我们强调了&#xff08;1&#xff09;嵌入生成&#xff0c;然后&#xff08;2&#xff09;使用近似近邻&#xff08;ANN&#xff09;搜索…

25.9 matlab里面的10中优化方法介绍—— 惩罚函数法求约束最优化问题(matlab程序)

1.简述 一、算法原理 1、问题引入 之前我们了解过的算法大部分都是无约束优化问题&#xff0c;其算法有&#xff1a;黄金分割法&#xff0c;牛顿法&#xff0c;拟牛顿法&#xff0c;共轭梯度法&#xff0c;单纯性法等。但在实际工程问题中&#xff0c;大多数优化问题都属于有约…

AI帮你制作海报

介绍 Microsoft Designer是由微软推出的图像处理软件&#xff0c;能够通过套用模板等方式快速完成设计加工&#xff0c;生成能够在社交媒体使用的图片。Designer的使用更为简单便捷&#xff0c;用户能够通过套用模板等方式快速完成设计加工&#xff0c;生成能够在社交媒体使用…

【计算机网络】应用层协议 -- HTTP协议

文章目录 1. 认识HTTP协议2. 认识URL3. HTTP协议格式3.1 HTTP请求协议格式3.2 HTTP响应协议格式 4. HTTP的方法5. HTTP的状态码6. HTTP的Header7. Cookie和Session 1. 认识HTTP协议 协议。网络协议的简称&#xff0c;网络协议是通信计算机双方必须共同遵守的一组约定&#xff0…

Rust vs Go:常用语法对比(五)

题图来自 Rust vs Go 2023[1] 81. Round floating point number to integer Declare integer y and initialize it with the rounded value of floating point number x . Ties (when the fractional part of x is exactly .5) must be rounded up (to positive infinity). 按规…

oCPC实践录 | oCPC下机制设计变得毫无意义?(2)无声的战争

接上回oCPC实践录 | oCPC下机制设计变得毫无意义&#xff1f;&#xff08;1&#xff09;事出异常必有妖&#xff0c;互联网广告最开始采用的广义第一价格密封拍卖&#xff08;GFP)&#xff0c;对广告主而言&#xff0c;需要不断感知竞争对手的变化&#xff0c;修改报价&#xf…

BIOS相关知识

简介 BIOS&#xff08;Basic Input Output System&#xff09;基本输入输出系统&#xff0c;固化在服务器主板的专用ROM中&#xff0c;是加载在服务器硬件系统上最基本的运行程序。BIOS位于硬件和系统中间&#xff0c;用来初始化硬件&#xff0c;为操作系统运行做准备 功能 …

ES6 - promise.all和race方法的用法详解

文章目录 一、前言二、Promise.all()1&#xff0c;第一句&#xff1a;Promise.all()方法接受一个数组作为参数&#xff0c;且每一个都是 Promise 实例2&#xff0c;第二句&#xff1a;如果不是&#xff0c;就会先调Promise.resolve方法&#xff0c;将参数转为 Promise 实例再进…