浅谈pandas用groupby后对层级索引levels的处理方法


Posted in Python onNovember 06, 2018

层及索引levels,刚开始学习pandas的时候没有太多的操作关于groupby,仅仅是简单的count、sum、size等等,没有更深入的利用groupby后的数据进行处理。近来数据处理的时候有遇到这类问题花了一点时间,所以这里记录以及复习一下:(以下皆是个人实践后的理解)

我使用一个实例来讲解下面的问题:一张数据表中有三列(动物物种、物种品种、品种价格),选出每个物种从大到小品种的前两种,最后只需要品种和价格这两列。

浅谈pandas用groupby后对层级索引levels的处理方法

以上这张表是我们后面需要处理的数据表 (物种 品种 价格)

levels:层及索引 (创建pandas类型时可以预先定义;使用groupby后也会生成)

我们看看levels什么样(根据df1物种分类,再根据df2品种排序后 如下图)

浅谈pandas用groupby后对层级索引levels的处理方法

图中可以看出,根据groupby分类后的cat、dog便是level,以及后面的一列原始位置索引也是level

好了现在简单了解levels,我们该如何对它进行处理,如何完成上面的实例呢?(可能你拿到这样的层级数据,不会操作,不知道如何提取其中的信息)

代码及讲解如下:

首先导入pandas、numpy库,以及创建原始数据:

import pandas as pd
import numpy as np
df = pd.DataFrame({'df1':['cat','cat','dog','cat','dog','dog'],'df2':[2,3,4,1,3,1],'df3':[100,200,100,300,200,200]})

原始数据最上面那张图

下面我们根据物种来分类,并且使用apply调用sort_df2函数对品种进行排序:

def sort_df2(data):
 data = data.sort_values(by='df2',ascending=False) #df2:品种列 ascending:排序方式
 return data
group = df.groupby(df['df1']).apply(sort_df2) #groupby以及apply的结合使用

处理后数据,上面第二张图

print(group.index) #看看groupby后的行索引什么样

浅谈pandas用groupby后对层级索引levels的处理方法

groupby后如上图,有层级标签(这里两列),labels标签(分类,位置)

这里我们需要的是第一层级标签的第一列(也就是cat、dog)

levels = group.index.levels[0] #取出第一级标签:

下面将是两层循环,完成从中选出(物种前两个品种以及它的价格),很简单的操作:

values = []
for i in levels:
 mid_group = group.loc[i] #选出i标签物种的所有品种
 mid_group = mid_group.iloc[:2,:] #我们只取排序后的品种的前两种(要注意这里使用iloc,它与loc的区别)
 cnt = len(mid_group) #为了防止循环长度错误,所以我们还是需要计算长度,因为如果真正数据不足2条还是不报错
 for j in range(cnt): #现在在每个物种cat、dog中操作
 value = mid_group.iloc[j,:] #我们选出该物种的第j条所有信息df1、df2、df3
 value_pro = (value['df2'],value['df3']) #然后只取df2、df3,将它们放到元组中
 values.append(value_pro)

所有的操作完成了,我们看看结果:

print(values) #此时在列表中保存了上面提取的元组信息,我们可以使用pandas再次转换它们为DataFrame,也可以做其它操作

浅谈pandas用groupby后对层级索引levels的处理方法

我觉得这个例子比较形象,但是还是有逻辑欠缺的地方,不过不重要,看懂了上面的例子,基本上就能了解和处理层级数据了。当然这里的数据简单,只是为了更好的理解,真正的处理数据时,可能会出现更为复杂的层级结构,这时需要能够更灵活的处理,如果你有更好的理解和建议,可以回复。

-------更新(增加对两层索引的操作)--------

在原来的基础上增加一列df4表示动物的大小特征

df = pd.DataFrame({'df1':['cat','cat','dog','cat','dog','dog'],'df2':[2,3,4,1,3,1],'df3':[100,200,100,300,200,200],'df4':['大','中','小','巨大','小','中']})

浅谈pandas用groupby后对层级索引levels的处理方法

此时根据df1、df4两列来分类,再对两层的层级索引操作:

df_group = df.groupby(['df1','df4']).size()

浅谈pandas用groupby后对层级索引levels的处理方法

分类后得到的是对应两个特征的动物数量,现在来取得其中的值:

print(df_group.index)
h = df_group.loc[['cat','df4']]
print(h)

先查看数据的index信息,从中我们可以看到两层索引对应的levels有两中,然后我们根据loc测试选出cat类的df4这一列(也可以填大、中、巨大选出一列)

浅谈pandas用groupby后对层级索引levels的处理方法

这样就得到了cat种类的信息,当然也可以选出dog种类,那么如何得出(cat,巨大,1)这样的一一对应的数据呢?

df1_name = df_group.index.levels[0]     #获得第一层的分类cat、dog
for i in range(len(df1_name)):  #循环遍历第一层
 df_level = df_group.loc[[df1_name[i],'df4']] #这里是选出第一层的所有信息
 df_level_ch = pd.DataFrame(df_level)   #由于上面得到是Series我们需要将它转换为DataFrame才能更好的操作
 for j in range(len(df_level_ch)):   #开始对第二层进行遍历
  a = df_level_ch.ix[j].name    #由于是DataFrame所以可以取每一行的name值('cat','大')
  b = df_level_ch.values[j][0]   #获取对应数量,由于是嵌套列表,所以我们逐层获取
  print(a,b)

浅谈pandas用groupby后对层级索引levels的处理方法

基本上是筛选出来了,还是很简单的。这只是其中的一个例子,如果遇到需要其他的操作,可以根据这个例子来随机变换。

这个方法虽然可以筛选,但是个人觉得数据量过大,就不是很好,暂时没有更好的方法,如果那位朋友有其他操作,可以分享一下。

以上这篇浅谈pandas用groupby后对层级索引levels的处理方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python 判断自定义对象类型
Mar 21 Python
python定时采集摄像头图像上传ftp服务器功能实现
Dec 23 Python
Windows下用py2exe将Python程序打包成exe程序的教程
Apr 08 Python
python高手之路python处理excel文件(方法汇总)
Jan 07 Python
centos6.7安装python2.7.11的具体方法
Jan 16 Python
Python 自动化表单提交实例代码
Jun 08 Python
高效测试用例组织算法pairwise之Python实现方法
Jul 19 Python
python 3.0 模拟用户登录功能并实现三次错误锁定
Nov 01 Python
Windows上使用Python增加或删除权限的方法
Apr 24 Python
python实现图片文件批量重命名
Mar 23 Python
关于python写入文件自动换行的问题
Jun 23 Python
python3应用windows api对后台程序窗口及桌面截图并保存的方法
Aug 27 Python
Python Series从0开始索引的方法
Nov 06 #Python
在Python中pandas.DataFrame重置索引名称的实例
Nov 06 #Python
pandas重新生成索引的方法
Nov 06 #Python
对pandas数据判断是否为NaN值的方法详解
Nov 06 #Python
删除DataFrame中值全为NaN或者包含有NaN的列或行方法
Nov 06 #Python
解决pandas.DataFrame.fillna 填充Nan失败的问题
Nov 06 #Python
对Pandas DataFrame缺失值的查找与填充示例讲解
Nov 06 #Python
You might like
菜鸟学PHP之Smarty入门
2007/01/04 PHP
PHP 采集程序原理分析篇
2010/03/05 PHP
php将数据库导出成excel的方法
2010/05/07 PHP
php实现图形显示Ip地址的代码及注释
2014/01/20 PHP
PHP判断表达式中括号是否匹配的简单实例
2016/10/22 PHP
php实现微信支付之企业付款
2018/05/30 PHP
Laravel中9个不经常用的小技巧汇总
2019/04/16 PHP
Nigma vs Alliance BO5 第二场2.14
2021/03/10 DOTA
文本有关的样式和jQuery求对象的高宽问题分别说明
2013/08/30 Javascript
jquery ajax jsonp跨域调用实例代码
2013/12/11 Javascript
JavaScript实现的一个计算数字步数的算法分享
2014/12/06 Javascript
Javascript 是你的高阶函数(高级应用)
2015/06/15 Javascript
vue.js国际化 vue-i18n插件的使用详解
2017/07/07 Javascript
vue-cli 3.x 配置Axios(proxyTable)跨域代理方法
2018/09/19 Javascript
详解vuex之store拆分即多模块状态管理(modules)篇
2018/11/13 Javascript
JS实现进度条动态加载特效
2020/03/25 Javascript
Python专用方法与迭代机制实例分析
2014/09/15 Python
Python的Bottle框架的一些使用技巧介绍
2015/04/08 Python
Python数据结构与算法之图的基本实现及迭代器实例详解
2017/12/12 Python
python 格式化输出百分号的方法
2019/01/20 Python
python使用BeautifulSoup与正则表达式爬取时光网不同地区top100电影并对比
2019/04/15 Python
PIL对上传到Django的图片进行处理并保存的实例
2019/08/07 Python
Python利用多线程同步锁实现多窗口订票系统(推荐)
2019/12/22 Python
Python连接Hadoop数据中遇到的各种坑(汇总)
2020/04/14 Python
在django中查询获取数据,get, filter,all(),values()操作
2020/08/09 Python
Python实现文件压缩和解压的示例代码
2020/08/12 Python
python中lower函数实现方法及用法讲解
2020/12/23 Python
CSS3之多背景background使用示例
2013/10/18 HTML / CSS
荷兰和比利时时尚鞋店:Van Dalen
2018/04/23 全球购物
娇韵诗俄罗斯官方网站:Clarins俄罗斯
2020/10/03 全球购物
以下的初始化有什么区别
2013/12/16 面试题
生物医学工程专业学生求职信范文分享
2013/12/14 职场文书
会计专业导师推荐信
2014/03/08 职场文书
2015年党务工作者个人工作总结
2015/10/22 职场文书
干部作风纪律整顿心得体会
2016/01/23 职场文书
JS前端监控采集用户行为的N种姿势
2022/07/23 Javascript