多级索引:在一个轴上有多个(两个以上)的索引,能够以低维度形式来表示高维度的数据。单级索引是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. day 07 预科

    目录 异常处理 字符串内置方法 1.索引取值 2.切片 3.成员运算 4.for循环 5.len() 6.strip(): 默认去掉两端空格 7.lsteip()/rstrip(): 去左端/右端 空 ...

  2. .NET Framework 项目多环境下配置文件web.config

    解决jenkins自动构建发布的问题,统一从git/svn库中获取项目文件,根据不同配置编译发布到多个运行环境中. 转自:https://www.cnblogs.com/hugogoos/p/6426 ...

  3. while 格式化输出 运算符 字符编码

    流程控制之while循环 条件循环:while,语法如下 while 条件: # 循环体 # 如果条件为真,那么循环体则执行,执行完毕后再次循环,重新判断条件... # 如果条件为假,那么循环体不执行 ...

  4. python_多线程

    1.多线程的实现与阻塞 import time import threading def fun_yellow(num): for i in range(1,num+1): print('正在拿第:' ...

  5. BS开发扫盲篇-前端技术风云录

    BS开发扫盲篇-前端技术风云录 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.     一.HTML诞生 HTML(HyperText Markup Language)超文本标记语言 ...

  6. saltstack安装使用

    官网地址:https://docs.saltstack.com/en/latest/ 安装 saltstack 1. ​ sudo yum install https://repo.saltstack ...

  7. 【Calling Circles UVA - 247 】【Floyd + dfs】

    用到的东西 Floyd算法(不考虑路径的长度,只关心两点之间是否有通路,可用于求有向图的传递闭包) STL map中的count用法 利用dfs输出同一个圈内的名字 题意 题目中给出 n 的人的名字, ...

  8. 《团队作业第三、第四周》五阿哥团队作业--Scrum 冲刺阶段--Day1--领航

    <团队作业第三.第四周>五阿哥团队作业--Scrum 冲刺阶段--Day1--领航 各个成员在 Alpha 阶段认领的任务 在团队合作时任务也会动态分配,最终以实际为主,上述具有参考价值. ...

  9. 接口测试-Java代码实现接口请求并封装

    前言:在接口测试和Java开发中对接口请求方法进行封装都非常有必要,无论是在我们接口测试的时候还是在开发自测,以及调用某些第三方接口时,都能为我们调用和调试接口提供便捷: Java实现对http请求的 ...

  10. c++中关联容器map的使用

    C++关联容器<map>简单总结(转) 补充: 使用count,返回的是被查找元素的个数.如果有,返回1:否则,返回0.注意,map中不存在相同元素,所以返回值只能是1或0. 使用find ...