pd.DataFrame中的几种索引变换的实现


Posted in Python onJune 16, 2022

导读:pandas中最常用的数据结构是DataFrame,而DataFrame相较于嵌套list或者二维numpy数组更好用的原因之一在于其提供了行索引和列名。本文主要介绍行索引的几种变换方式,包括rename与reindex、index.map、set_index与reset_index、stack与unstack等。

pd.DataFrame中的几种索引变换的实现

惯例开局一张图

01 索引简介与样例数据

Series和DataFrame是pandas中的主要数据结构类型(老版本中曾有三维数据结构Panel,是DataFrame的容器,后被取消),而二者相较于传统的数组或list而言,最大的便利之处在于其提供了索引,DataFrame中还有列标签名,这些都使得在操作一行或一列数据中非常方便,包括在数据访问、数据处理转换等。

这里,为了便于后文举例解释,给出基本的DataFrame样例数据如下:

pd.DataFrame中的几种索引变换的实现

后文将以此作为操作对象,针对索引的几种常用变换进行介绍。

注:这里的索引应广义的理解为既包扩行索引,也包括列标签。

02 reindex和rename

学习pandas之初,reindex和rename容易使人混淆的一组接口,就其具体功能来看:

  • reindex执行的是索引重组操作,接收一组标签序列作为新索引,既适用于行索引也适用于列标签名,重组之后索引数量可能发生变化,索引名为传入标签序列
  • rename执行的是索引重命名操作,接收一个字典映射或一个变换函数,也均适用于行列索引,重命名之后索引数量不发生改变,索引名可能发生变化

另外二者执行功能和接收参数的套路也是很为相近的,均支持两种变换方式:

  • 一种是变换内容+axis指定作用轴(可选0/1或index/columns);
  • 另一种是直接用index/columns关键字指定作用轴

具体而言,reindex执行索引重组操作,以新接收的一组标签序列作为索引,当原DataFrame中存在该索引时则提取相应行或列,否则赋值为空或填充指定值。对于前面介绍的示例数据df,以重组行索引为例,两种可选方式为:

pd.DataFrame中的几种索引变换的实现

注意到原df中行索引为[1, 3, 5],而新重组的目标索引为[1, 2, 3],其中[1, 3]为已有索引直接提取,[2, 4]在原df中不存在,所以填充空值;同时,原df中索引[5]由于不在指定索引中,所以遭舍弃。进一步地,由于重组后可能存在空值,reindex提供了填充空值的可选参数fill_value和method,二者用法与fillna方法一致,前者用于指定固定值填充,后者用于指定填充策略,例如:

pd.DataFrame中的几种索引变换的实现

rename用法套路与reindex很为相近,但执行功能完全不同,主要用于执行索引重命名操作,接收一个字典或一个重命名规则的函数类型,示例如下:

pd.DataFrame中的几种索引变换的实现

03 index.map

针对DataFrame中的数据,pandas中提供了一对功能有些相近的接口:map和apply,以及applymap,其中map仅可用于DataFrame中的一列(也即即Series),可接收字典或函数完成单列数据的变换;apply既可用于一列(即Series)也可用于多列(即DataFrame),但仅可接收函数作为参数,当作用于Series时对每个元素进行变换,作用于DataFrame时对其中的每一行或每一列进行变换;而applymap则仅可作用于DataFrame,且作用对象是对DataFrame中的每个元素进行变换。也就是说,三者的最大不同在于作用范围以及变换方式的不同。

实际上,apply和map还有一个细微区别在于:同样是可作用于单列对象,apply适用于索引这种特殊的单列,而map则不适用。所以,对索引执行变换的另一种可选方式是用map函数,其具体操作方式与DataFrame常规map操作一致,接收一个函数作为参数即可:

pd.DataFrame中的几种索引变换的实现

04 set_index与reset_index

set_index和reset_index是一对互逆的操作,其中前者用于置位索引——将DataFrame中某一列设置为索引,同时丢弃原索引;而reset_index用于复位索引——将索引加入到数据中作为一列或直接丢弃,可选drop参数。二者是非常常用的一组操作,例如在执行groupby操作后一般会得到一个series类型,此时增加一个reset_index操作即可实现series转换为DataFrame。当然转换的操作不止这一种。

pd.DataFrame中的几种索引变换的实现

05 stack与unstack

这也是一对互逆的操作,其中stack原义表示堆叠,实现将所有列标签堆叠到行索引中;unstack即解堆,用于将复合行索引中的一个维度索引平铺到列标签中。实际上,二者的操作即是SQL中经典的行转列与列转行,也即在长表与宽表之间转换。

pd.DataFrame中的几种索引变换的实现

当然,实现unstack操作的方式还有pivot,此处不再展开。

到此这篇关于pd.DataFrame中的几种索引变换的实现的文章就介绍到这了,更多相关pd.DataFrame 索引变换内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!


Tags in this post...

Python 相关文章推荐
python字符串加密解密的三种方法分享(base64 win32com)
Jan 19 Python
python以环状形式组合排列图片并输出的方法
Mar 17 Python
python和opencv实现抠图
Jul 18 Python
python代码过长的换行方法
Jul 19 Python
python交易记录整合交易类详解
Jul 03 Python
Flask-WTF表单的使用方法
Jul 12 Python
Python封装成可带参数的EXE安装包实例
Aug 24 Python
Python学习笔记之函数的参数和返回值的使用
Nov 20 Python
Python将二维列表list的数据输出(TXT,Excel)
Apr 23 Python
python 识别登录验证码图片功能的实现代码(完整代码)
Jul 03 Python
Python logging日志库空间不足问题解决
Sep 14 Python
requests在python中发送请求的实例讲解
Feb 17 Python
Python实战实现爬取天气数据并完成可视化分析详解
pandas时间序列之pd.to_datetime()的实现
Jun 16 #Python
pandas中pd.groupby()的用法详解
Jun 16 #Python
python中pd.cut()与pd.qcut()的对比及示例
Jun 16 #Python
Python自动操作神器PyAutoGUI的使用教程
Jun 16 #Python
python内置模块之上下文管理contextlib
Jun 14 #Python
Python时间操作之pytz模块使用详解
You might like
php使用fopen创建utf8编码文件的方法
2014/10/31 PHP
Json_decode 解析json字符串为NULL的解决方法(必看)
2017/02/17 PHP
利用laravel搭建一个迷你博客实战教程
2017/08/13 PHP
Yii框架多语言站点配置方法分析【中文/英文切换站点】
2020/04/07 PHP
Docker 安装 PHP并与Nginx的部署实例讲解
2021/02/27 PHP
用js实现计算代码行数的简单方法附代码
2007/08/13 Javascript
Jquery插件 easyUI属性汇总
2011/01/19 Javascript
提高javascript效率 一次判断,而不要次次判断
2012/03/30 Javascript
JavaScript的继承的封装介绍
2013/10/15 Javascript
jQuery获取动态生成的元素示例
2014/06/15 Javascript
node.js中的fs.readdir方法使用说明
2014/12/17 Javascript
js 获取本地文件及目录的方法(推荐)
2016/11/10 Javascript
微信小程序 使用腾讯地图SDK详解及实现步骤
2017/02/28 Javascript
详解AngularJS1.x学习directive 中‘& ’‘=’ ‘@’符号的区别使用
2017/08/23 Javascript
学习使用ExpressJS 4.0中的新Router的用法
2018/11/06 Javascript
jQuery实现侧边栏隐藏与显示的方法详解
2018/12/22 jQuery
js数组去重的方法总结
2019/01/18 Javascript
详解jQuery设置内容和属性
2019/04/11 jQuery
JavaScript从原型到原型链深入理解
2019/06/03 Javascript
axios实现简单文件上传功能
2019/09/25 Javascript
[44:26]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#4EG VS Fnatic第二局
2016/03/03 DOTA
[02:17]快乐加倍!DOTA2食人魔魔法师至宝+迎霜节活动上线
2019/12/22 DOTA
跟老齐学Python之大话题小函数(2)
2014/10/10 Python
Python使用email模块对邮件进行编码和解码的实例教程
2016/07/01 Python
Django如何将URL映射到视图
2019/07/29 Python
CSS3制作彩色进度条样式的代码示例分享
2016/06/23 HTML / CSS
英国家居装饰品、户外家具和玻璃器皿购物网站:Rinkit.com
2019/11/04 全球购物
解释下面关于J2EE的名词
2013/11/15 面试题
农村改厕实施方案
2014/03/22 职场文书
红色故事演讲稿
2014/05/22 职场文书
领导干部贪图享乐整改措施
2014/09/21 职场文书
企业法人授权委托书
2014/09/25 职场文书
教师党员群众路线教育实践活动心得体会
2014/11/04 职场文书
python实现批量提取指定文件夹下同类型文件
2021/04/05 Python
golang 实现两个结构体复制字段
2021/04/28 Golang
JavaScript严格模式不支持八进制的问题讲解
2021/11/07 Javascript