文章目录

  • 层次化索引的概念
  • 层次化索引的创建
    • 使用嵌套列表的方式构造层次化索引对象
      • Series对象
      • DataFrame对象
    • 通过MultiIndex类的方法构建层次化索引
      • 通过from_tuples()方法创建MultiIndex对象
      • 通过from_arrays()方法创建MultiIndex对象
      • 通过from_product()方法创建MultiIndex对象
  • 层次化索引的操作
    • 选取子集
      • 获取外层索引子集
      • 获取内层索引子集
    • 交换分层顺序——swaplevel()
    • 排序分层
      • sort_index()
      • sort_values()

层次化索引的概念

只有一层索引结构(行索引、列索引)的Pandas对象称为单层索引层次化索引可以理解为单层索引的延申,即在一个轴方向上具有多层索引


层次化索引的创建

使用嵌套列表的方式构造层次化索引对象

Series对象

使用构造方法创造Series对象时,index参数接收了一个嵌套列表来设置索引的层级。

嵌套的第一个列表会作为外层索引第二个列表会作为内层索引

import pandas as pd
import numpy as npse = pd.Series([1, 2, 3, 4, 5, 6, 7, 8],index=[['河北省', '河北省', '河北省', '河北省','河南省', '河南省', '河南省', '河南省'],['石家庄', '唐山', '邯郸', '秦皇岛', '郑州', '开封', '洛阳', '新乡']])
print(se)

输出结果:

河北省  石家庄    1唐山     2邯郸     3秦皇岛    4
河南省  郑州     5开封     6洛阳     7新乡     8
dtype: int64

DataFrame对象

嵌套函数中两个列表的长度必须是保持一致的,否则将会出现ValueError错误。

df = DataFrame([1, 2, 3, 4, 5, 6, 7, 8],index=[['河北省', '河北省', '河北省', '河北省','河南省', '河南省', '河南省', '河南省'],['石家庄', '唐山', '邯郸', '秦皇岛', '郑州', '开封', '洛阳', '新乡']],columns=['占地面积'])
print(df)
df1 = DataFrame({'占地面积': [1, 2, 3, 4, 5, 6, 7, 8]},index=[['河北省', '河北省', '河北省', '河北省','河南省', '河南省', '河南省', '河南省'],['石家庄', '唐山', '邯郸', '秦皇岛', '郑州', '开封', '洛阳', '新乡']])
print(df1)

输出结果: 两种方式的输出结果是一致的

         占地面积
河北省 石家庄     1唐山      2邯郸      3秦皇岛     4
河南省 郑州      5开封      6洛阳      7新乡      8占地面积
河北省 石家庄     1唐山      2邯郸      3秦皇岛     4
河南省 郑州      5开封      6洛阳      7新乡      8

通过MultiIndex类的方法构建层次化索引

除了使用嵌套列表的方式构造层次化索引以外,还可以通过MultiIndex类的方法构建一个层次化索引。


MultiIndex类提供了3种创建层次化索引的方法。

MultiIndex.from_tuples():将元组列表转换为MultiIndex。

MultiIndex.from_arrays():将数组列表转换为MultiIndex。

MultiIndex.from_product():从多个集合的笛卡尔乘积种创建一个MultiIndex。


MultiIndex类对象种有三个比较重要的属性

levels : 表示每个级别的唯一标签

labels : 表示每一个索引列种每个元素在levels中对应的第几个元素

names :设置索引等级名称


通过from_tuples()方法创建MultiIndex对象

from_tuples()方法可以将包含若干个元组的列表转换为MultiIndex对象,其中元组的第一个元素作为外层索引,元组的第二个元素作为内层索引

from pandas import MultiIndexlist_tuples = [('A', 'A1'), ('A', 'A2'), ('A', 'A3'), ('B', 'B1'), ('B', 'B2')]
# 创建包含多个元组的列表
multi_tuple = MultiIndex.from_tuples(tuples=list_tuples, names=['外层索引', '内层索引'])
# 根据元组列表创建一个MultiIndex对象
print(multi_tuple)

输出结果:

MultiIndex([('A', 'A1'),('A', 'A2'),('A', 'A3'),('B', 'B1'),('B', 'B2')],names=['外层索引', '内层索引'])

接下来,创建一个DataFrame对象,把刚创建的创建的multi_tuple传递给index参数

import pandas as pdvalue = [[1, 2, 3], [8, 5, 7], [4, 7, 7], [5, 5, 4], [4, 9, 9]]
df_tuple = pd.DataFrame(data=value, index=multi_tuple)
print(df_tuple)

输出结果:

外层索引 内层索引
A    A1    1  2  3A2    8  5  7A3    4  7  7
B    B1    5  5  4B2    4  9  9

通过from_arrays()方法创建MultiIndex对象

from_arrays()方法是将数组列表转换为MultiIndex对象,其中嵌套的第一个列表将作为外层索引,嵌套的第二个列表将作为内层索引

from pandas import MultiIndexmulti_array = MultiIndex.from_arrays(arrays=[['A', 'B', 'A', 'B', 'B'],['A1', 'A2', 'B1', 'B2', 'B3']],names=['外层索引', '内层索引'])
# 根据列表创建一个MultiIndex对象
print(multi_array)

输出结果:

MultiIndex([('A', 'A1'),('B', 'A2'),('A', 'B1'),('B', 'B2'),('B', 'B3')],names=['外层索引', '内层索引'])

参数arrays既可以接收列表,也可以接受数组,不过每个列表或者数组的长度必须是相同的

接下来,创建一个DataFrame对象,把刚刚创建的multi_array传递给index参数。

import pandas as pd
import numpy as npvalue1 = np.arange(10).reshape(5, 2)
df_array = pd.DataFrame(data=value1, index=multi_array)
print(df_array)

输出结果:

           0  1
外层索引 内层索引
A    A1    0  1
B    A2    2  3
A    B1    4  5
B    B2    6  7B3    8  9

通过from_product()方法创建MultiIndex对象

from_product()方法表示从多个集合的笛卡尔积中创建一个MultiIndex对象。

number = [0, 1, 2]
colors = ['green', 'purple']
multi_product = pd.MultiIndex.from_product(iterables=[number, colors],names=['number', 'color'])
print(multi_product)

输出结果:

MultiIndex([(0,  'green'),(0, 'purple'),(1,  'green'),(1, 'purple'),(2,  'green'),(2, 'purple')],names=['number', 'color'])

接下来,创建一个DataFrame对象,把刚刚创建的multi_product传递给index参数,让该对象有两层索引结构。

value2 = np.arange(12).reshape(6, 2)
df_product = pd.DataFrame(data=value2, index=multi_product)
print(df_product)

输出结果:

                0   1
number color
0      green    0   1purple   2   3
1      green    4   5purple   6   7
2      green    8   9purple  10  11

层次化索引的操作

选取子集

创建Series对象

ser_obj = Series([50, 60, 40, 94, 63, 101, 200, 56, 45],index=[['小说', '小说', '小说','散文随笔', '散文随笔', '散文随笔','传记', '传记', '传记'],['高山上的小邮局', '失踪的总统', '绿毛水怪','皮囊', '浮生六记', '自在独行','梅西', '老舍自传', '库里传']])
print(ser_obj)

输出结果:

小说    高山上的小邮局     50失踪的总统       60绿毛水怪        40
散文随笔  皮囊          94浮生六记        63自在独行       101
传记    梅西         200老舍自传        56库里传         45
dtype: int64

获取外层索引子集

例如获取所有外层索引为“小说”的子集

print(ser_obj['小说'])

输出结果:

高山上的小邮局    50
失踪的总统      60
绿毛水怪       40
dtype: int64

获取内层索引子集

例如获取内层索引为“老舍自传”的子集

print(ser_obj[:, '老舍自传'])

输出结果:

传记    56
dtype: int64

交换分层顺序——swaplevel()

交换分层顺序是指交换外层索引和内层索引的位置。

print(ser_obj.swaplevel())

输出结果:

高山上的小邮局  小说       50
失踪的总统    小说       60
绿毛水怪     小说       40
皮囊       散文随笔     94
浮生六记     散文随笔     63
自在独行     散文随笔    101
梅西       传记      200
老舍自传     传记       56
库里传      传记       45
dtype: int64

排序分层

sort_index()

sort_index(
self,
axis=0,
level=None,
ascending=True,
inplace=False,
kind=“quicksort”,
na_position=“last”,
sort_remaining=True,
ignore_index: bool = False,
)

上述方法的部分参数含义如下:

ascending: 是否升序排列,默认为True,升序排列。

在使用sort_index()方法排序时,会优先选择按外层索引进行排序,然后再按照内层索引进行排序。


创建一个DataFrame对象

df_obj = DataFrame({'word': ['a', 'b', 'd', 'e', 'f', 'k', 'd', 's', 'l'],'num':['1', '2', '4', '5', '3', '2', '6', '2', '3']},index=[['A', 'A', 'A', 'C', 'C', 'C', 'B', 'B', 'B'],[1, 3, 2, 3, 1, 2, 4, 5, 8]])
print(df_obj)

输出结果:

 word num
A 1    a   13    b   22    d   4
C 3    e   51    f   32    k   2
B 4    d   65    s   28    l   3

按索引排序

print(df_obj.sort_index())

输出结果:

 word num
A 1    a   12    d   43    b   2
B 4    d   65    s   28    l   3
C 1    f   32    k   23    e   5

sort_values()

sort_values(
self,
by,
axis=0,
ascending=True,
inplace=False,
kind=“quicksort”,
na_position=“last”,
ignore_index=False,
)

上述方法的部分参数含义如下:

by: 按指定的值排序,是sort_values()必须填写的参数


按照列索引num进行降序排列

print(df_obj.sort_values(by=['num'], ascending=False))

输出结果:

word num
B 4    d   6
C 3    e   5
A 2    d   4
C 1    f   3
B 8    l   3
A 3    b   2
C 2    k   2
B 5    s   2
A 1    a   1

Pandas对象的层次化索引——【from_tuples()、from_arrays()、from_product()、swaplevel()、sort_index()、sort_values()】相关推荐

  1. 关于groupby与层次化索引的联系和层次化标签的使用

    groupby出来对象并不是dataFrame,所以直接print是看不到矩阵或者高维矩阵的,所以需要用能够产生标量值的方法去处理groupby对象,这样可以利用矩阵形式处理高维数据: 这样group ...

  2. Pandas 基础 (5) —— 处理缺失数据及层次化索引

    处理缺失数据 pandas 使用浮点值 NaN (Not a Number)表示浮点和非浮点数组中的缺失数据.它只是一个便于被检测出来的标记而已. In [168]: data = Series([' ...

  3. 数据分析之pandas学习笔记(六)(层次化索引、重塑、轴向旋转、行列变换、合并表数据)

    数据分析之Pandas学习笔记(六)(层次化索引.重塑.轴向旋转.行列变换.合并表数据) level层次化索引 unstack()与stack()进行重塑,即:行列索引变换 swaplevel()交换 ...

  4. Python 数据分析三剑客之 Pandas(二):Index 索引对象以及各种索引操作

    CSDN 课程推荐:<迈向数据科学家:带你玩转Python数据分析>,讲师齐伟,苏州研途教育科技有限公司CTO,苏州大学应用统计专业硕士生指导委员会委员:已出版<跟老齐学Python ...

  5. 利用python进行数据分析——使用groupby机制对pandas对象类的数据进行聚合与分组操作

    文章目录 数据聚合与分组操作 一.GroupBy机制 1.1遍历各分组 1.2选取一列或所有列的子集 1.3 通过字典或Series进行分组 1.4 通过函数进行分组 1.5根据索引层级分组 二. 数 ...

  6. pandas学习(创建多层索引、数据重塑与轴向旋转)

    pandas学习(创建多层索引.数据重塑与轴向旋转) 目录 创建多层索引 数据重塑与轴向旋转 创建多层索引 隐式构造 Series 最常见的方法是给DataFrame构造函数的index参数传递两个或 ...

  7. python pandas dataframe 不显示索引_Python DataFrame 设置输出不显示index(索引)值的方法...

    Python DataFrame 设置输出不显示index(索引)值的方法 在输出代码行中,加入"index=False"如下: m_pred_survived.to_csv(&q ...

  8. 【Python】快速认识Pandas的10大索引

    公众号:尤而小屋 作者:Peter 编辑:Peter 今天给大家带来一篇关于Pandas索引的文章:10种你必须掌握的Pandas索引. 索引在我们的日常生活中其实是很常见的,就像: 一本书有自己的目 ...

  9. 数据科学 IPython 笔记本 7.4 Pandas 对象介绍

    7.4 Pandas 对象介绍 原文:Introducing Pandas Objects 译者:飞龙 协议:CC BY-NC-SA 4.0 本节是<Python 数据科学手册>(Pyth ...

最新文章

  1. 3亿人养老靠机器人?这家公司要在2030年实现,有谱
  2. iis cgi 无法使用_ASP.NET Core前后端分离项目使用gitlabci持续集成到IIS
  3. Zookeeper .Net客户端代码
  4. 论文浅尝 | 一种基于递归超图的知识图谱问答方法
  5. 125_Power BI 中 DAX 的性能测试
  6. Spring的IOC机制
  7. opencv 指定分辨率_使用opencv拉伸图像扩大分辨率示例
  8. Atitit 项目管理之沟通管理概论问题管理 艾提拉著 跨语言沟通 群组沟通 书面沟通 目录 1. 沟通方式 2 1.1. 书面沟通 vs 当面沟通 2 1.2. 群组沟通(公开沟通) vs
  9. 关于数据库主键和外键(终于弄懂啦)
  10. stm32 ov2640硬件软件笔记
  11. 基于 USB 传输的针式打印机驱动程序开发
  12. MATLAB求导相关知识,matlab如何求导相关阅读-matlab如何求导文章阅读-123文学网
  13. iOS-AppStore上线被拒的各种理由...
  14. deepin15.9的linux内核版本,深度Deepin 15.9操作系统首次更新内容
  15. protobuf如何使用Protogen工具生成CS代码详细教学篇
  16. java的excel模板下载(解决中文名乱码问题)
  17. Python 实战案例--计算圆、矩形的周长和面积
  18. 魅族官方刷机教程地址(免费)
  19. 浅谈IT行业中的隐私泄露问题
  20. [BDSec CTF 2022] 部分WP

热门文章

  1. python源码剖析_Python源码剖析 - 对象初探
  2. 如何改善虚幻引擎中的游戏线程CPU性能表现
  3. win32 ipv6 sendto recvfrom
  4. java实现c语言的函数_C语言实现返回字符串函数的四种方法
  5. css宋体代码_html布局中统一设置文字字体样式
  6. 【转】dcmtk程序包综述(2)!!!!!
  7. 【转】2.1【MySQL】运行原理(一):查询sql的执行过程及MySQL架构分析
  8. 37职责链模式(Chain of Responsibility Pattern)
  9. 分布式事务解决方案框架(LCN)
  10. 用姓名字段统计人数_基于 Wide amp; Deep 网络和 TextCNN 的敏感字段识别