多级索引:在一个轴上有多个(两个以上)的索引,能够以低维度形式来表示高维度的数据。单级索引是Index对象,多级索引是MultiIndex对象。

一、创建多级索引

  • 方法一:隐式创建,即给DataFrame的indexcolumns参数传递两个或更多的数组。

    df1 = pd.DataFrame(np.random.randint(80, 120, size=(2, 4)),
    index= ['girl', 'boy'],
    columns=[['English', 'English', 'Chinese', 'Chinese'],
    ['like', 'dislike', 'like', 'dislike']]) print(df1) # 创建多级 列 索引
    -------------------------------------------------------------------------------------
    English Chinese
    like dislike like dislike
    girl 85 109 117 110
    boy 85 111 100 107
  • 方法二、显示创建,推荐使用较简单的pd.MultiIndex.from_product方法
    df2 = pd.DataFrame(np.random.randint(80, 120, size=(4, 2)),
    columns= ['girl', 'boy'],
    index=pd.MultiIndex.from_product([['English','Chinese'],
    ['like','dislike']]))
    print(df2) # 创建多级 行 索引
    -------------------------------------------------------------------------------------
    girl boy
    English like 92 98
    dislike 118 99
    Chinese like 109 108
    dislike 108 91

二、检索多级索引

  • 类似单级索引检索(loc、iloc),以df1数据为例

    df1.English
    -------------------------------------------------------------------------------------
    like dislike
    girl 105 112
    boy 118 87 df1.English.dislike
    -------------------------------------------------------------------------------------
    girl 112
    boy 87
    Name: dislike, dtype: int64 df1.iloc[:,0:3]
    -------------------------------------------------------------------------------------
    English Chinese
    like dislike like
    girl 85 113 82
    boy 97 83 94 df1.loc['girl', ['English', 'Chinese']]
    -------------------------------------------------------------------------------------
    English like 105
    dislike 112
    Chinese like 87
    dislike 92
    Name: girl, dtype: int64
  • 多级索引的检索,可以使用更高级的方法,如xs、IndexSlice等,用到较少暂不介绍。

三、更改索引的层级

  1. 创建多级索引

    df = pd.DataFrame(np.random.randint(80, 120, size=(6, 4)),
    index= pd.MultiIndex.from_product([[1, 2, 3],['girl', 'boy']]),
    columns=pd.MultiIndex.from_product([['English','Chinese'],
    ['Y','N']]))
    print(df)
    -------------------------------------------------------------------------------------
    English Chinese
    Y N Y N
    1 girl 86 99 111 105
    boy 85 110 113 112
    2 girl 98 106 108 94
    boy 117 80 97 83
    3 girl 95 81 114 95
    boy 106 95 119 81
  2. 为多级索引命名
    df.columns.names = ['Language', 'Pass']    # 设置列索引名
    df.index.names = ['Class', 'Six'] # 设置行索引名 print(df)
    -------------------------------------------------------------------------------------
    Language English Chinese
    Pass Y N Y N
    Class Six
    1 girl 86 99 111 105
    boy 85 110 113 112
    2 girl 98 106 108 94
    boy 117 80 97 83
    3 girl 95 81 114 95
    boy 106 95 119 81
  3. 更改索引的层级(swaplevel)
    df.swaplevel('Six','Class')    # 更改行索引的层级
    -------------------------------------------------------------------------------------
    Language English Chinese
    Pass Y N Y N
    Six Class
    girl 1 86 99 111 105
    boy 1 85 110 113 112
    girl 2 98 106 108 94
    boy 2 117 80 97 83
    girl 3 95 81 114 95
    boy 3 106 95 119 81

四、多级索引的值排序(sort_index)

  • 方法一

    df.sort_index(level=0, axis=0, ascending=False)    # 对行索引Class的值进行降序排列
    -------------------------------------------------------------------------------------
    Language English Chinese
    Pass Y N Y N
    Class Six
    3 girl 95 81 114 95
    boy 106 95 119 81
    2 girl 98 106 108 94
    boy 117 80 97 83
    1 girl 86 99 111 105
    boy 85 110 113 112
  • 方法二:使用sortlevel方法,从0.20.0版本开始,已经被弃用

五、多级索引汇总统计

  • 示例一

    df.sum(level=1) 或df.sum(level='Six')    # 对行索引Six进行求和
    -------------------------------------------------------------------------------------
    Language English Chinese
    Pass Y N Y N
    Six
    girl 279 286 333 294
    boy 308 285 329 276
  • 示例二
    df.sum(level=0, axis=1)  或 df.sum(level='Language', axis=1)    # 对列索引Language进行求和
    -------------------------------------------------------------------------------------
    Language English Chinese
    Class Six
    1 girl 185 216
    boy 195 225
    2 girl 204 202
    boy 197 180
    3 girl 176 209
    boy 201 200

六、多级索引轴向转换

  • 常见的数据层次化结构:树状和表格

     
     
  • 轴向转换的函数
    1. stack() : 将行索引变成列索引,可以理解为将表格数据转换为树状数据
    2. unstack() : 将列索引变成行索引,可以理解为将树状数据转换为表格数据
    3. 两个函数互为逆函数,作用相反,用法相同。单级索引时,结果会生成一个Series;多级索引时默认转换最内层索引,也可以自定义转换的索引层级
  • 示例
      print(df)    # 数据源
    -------------------------------------------------------------------------------------
    Language English Chinese
    Pass Y N Y N
    Class Six
    1 girl 86 99 111 105
    boy 85 110 113 112
    2 girl 98 106 108 94
    boy 117 80 97 83
    3 girl 95 81 114 95
    boy 106 95 119 81 df.stack() # 默认将最内层的行索引(Pass)转换为了列索引
    -------------------------------------------------------------------------------------
    Language Chinese English
    Class Six Pass
    1 girl N 105 99
    Y 111 86
    boy N 112 110
    Y 113 85
    2 girl N 94 106
    Y 108 98
    boy N 83 80
    Y 97 117
    3 girl N 95 81
    Y 114 95
    boy N 81 95
    Y 119 106 df.unstack(level=0) # 指定将列索引(Class)转化成行索引
    -------------------------------------------------------------------------------------
    Language English Chinese
    Pass Y N Y N
    Class 1 2 3 1 2 3 1 2 3 1 2 3
    Six
    boy 85 117 106 110 80 95 113 97 119 112 83 81
    girl 86 98 95 99 106 81 111 108 114 105 94 95

七、多级索引转换单级索引

  • 步骤:先将多级的行索引转换为列索引,再重置列索引
  • 示例
    dt = df.stack()   # 将内层行索引()转换为列索引
    dt = dt.reset_index() # 重置列索引 print(dt)
    -------------------------------------------------------------------------------------
    Language Class Six Pass Chinese English
    0 1 girl N 105 99
    1 1 girl Y 111 86
    2 1 boy N 112 110
    3 1 boy Y 113 85
    4 2 girl N 94 106
    5 2 girl Y 108 98
    6 2 boy N 83 80
    7 2 boy Y 97 117
    8 3 girl N 95 81
    9 3 girl Y 114 95
    10 3 boy N 81 95
    11 3 boy Y 119 106
 
 

Pandas进阶之DataFrame多级索引的更多相关文章

  1. 数据分析入门——pandas之DataFrame多层/多级索引与聚合操作

    一.行多层索引 1.隐式创建 在构造函数中给index.colunms等多个数组实现(datafarme与series都可以) df的多级索引创建方法类似: 2.显式创建pd.MultiIndex 其 ...

  2. Pandas系列(十八)- 多级索引

    多级索引 多级索引(也称层次化索引)是pandas的重要功能,可以在Series.DataFrame对象上拥有2个以及2个以上的索引.实质上,单级索引对应Index对象,多级索引对应MultiInde ...

  3. 程序员用于机器学习编程的Python 数据处理库 pandas 进阶教程

    数据访问 在入门教程中,我们已经使用过访问数据的方法.这里我们再集中看一下. 注:这里的数据访问方法既适用于Series,也适用于DataFrame. **基础方法:[]和. 这是两种最直观的方法,任 ...

  4. pandas | 使用pandas进行数据处理——DataFrame篇

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是pandas数据处理专题的第二篇文章,我们一起来聊聊pandas当中最重要的数据结构--DataFrame. 上一篇文章当中我们介绍了 ...

  5. pandas 学习(2): pandas 数据结构之DataFrame

    DataFrame 类型类似于数据库表结构的数据结构,其含有行索引和列索引,可以将DataFrame 想成是由相同索引的Series组成的Dict类型.在其底层是通过二维以及一维的数据块实现. 1.  ...

  6. python数据分析之pandas库的DataFrame应用二

    本节介绍Series和DataFrame中的数据的基本手段 重新索引 pandas对象的一个重要方法就是reindex,作用是创建一个适应新索引的新对象 ''' Created on 2016-8-1 ...

  7. pandas数据结构之Dataframe

    Dataframe DataFrame是一个[表格型]的数据结构,可以看做是[由Series组成的字典](多个series共用同一个索引).DataFrame由按一定顺序排列的多列数据组成.设计初衷是 ...

  8. [转]python中pandas库中DataFrame对行和列的操作使用方法

    转自:http://blog.csdn.net/u011089523/article/details/60341016 用pandas中的DataFrame时选取行或列: import numpy a ...

  9. Pandas之Series+DataFrame

    Series是带有标签的一维数组,可以保存任何数据类型(整数,字符串,浮点数,python对象) index查看series索引,values查看series值 series相比于ndarray,是一 ...

随机推荐

  1. 60 分钟极速入门 PyTorch

    2017 年初,Facebook 在机器学习和科学计算工具 Torch 的基础上,针对 Python 语言发布了一个全新的机器学习工具包 PyTorch. 因其在灵活性.易用性.速度方面的优秀表现,经 ...

  2. 关于ssh_config和sshd_config

    转载:https://www.cnblogs.com/panda2046/p/5933498.html   在远程管理linux系统基本上都要使用到ssh,原因很简单:telnet.FTP等传输方式是 ...

  3. thinkphp5.x命令执行漏洞复现及环境搭建

    楼主Linux环境是Centos7,LAMP怎么搭不用我废话吧,别看错了 一.thinkphp5.X系列 1.安装composer yum -y install composer 安装php拓展 yu ...

  4. django项目中使用手机号登录

    本文使用聚合数据的短信接口,需要先获取到申请接口的appkey和模板id 项目目录下创建ubtils文件夹,定义返回随机验证码和调取短信接口的函数 function.py文件 import rando ...

  5. python的tkinter,能画什么图?

    今天从下午忙到现在,睡觉. 这个能绘点图的. import json import tkinter as tk from tkinter import filedialog from tkinter ...

  6. Python 推送RabbitMQ

    username = 'xxxxxxxx' pwd = 'xxxxxxxx' user_pwd = pika.PlainCredentials(username, pwd) s_conn = pika ...

  7. Hadoop跨集群迁移数据(整理版)

    1. 什么是DistCp DistCp(分布式拷贝)是用于大规模集群内部和集群之间拷贝的工具.它使用Map/Reduce实现文件分发,错误处理和恢复,以及报告生成.它把文件和目录的列表作为map任务的 ...

  8. django-登录后得个人信息

    Web请求中的认证:https://yiyibooks.cn/xx/django_182/topics/auth/default.html Django使用会话和中间件来拦截request 对象到认证 ...

  9. learning scasl notes

    接收类型参数的类和特质是“泛型”的,但是它们生成的类型是"参数化". ”泛型“的意思是我们用一个泛化的类或特质来定义许许多多具体的类型. 如果说S是类型T的子类型,那么Queue[ ...

  10. Switch ……case语句

    Switch(变量){ case 1: 如果变量和1的值相同,执行该处代码 break; case 2: 如果变量和2的值相同,执行该处代码 break; case 3: 如果变量和3的值相同,执行该 ...