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

文章目录

  • 层次化索引的概念
  • 层次化索引的创建
    • 使用嵌套列表的方式构造层次化索引对象
      • 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/443861.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《这是全网最硬核redis总结,谁赞成,谁反对?》六万字大合集

我摊牌了,这篇文章,值得99%的人收藏 此文后续会改为粉丝可见,所以喜欢的请提前关注和收藏,不迷路。 最近有五本我喜欢的redis实体新书,想要的去评论,我写个随机数抽奖包邮送给你。 那么,准备好…

Python数据预处理之异常值的处理——【自定义的three_sigma()函数、boxplot()方法】

文章目录基于3σ原则检测异常值代码实现测试基于箱型图检测异常值异常值的处理基于3σ原则检测异常值 3σ原则,又称拉依达准则。是指假设一组检测数据只含有随机误差。对其进行计算处理得到标准偏差,按一定概率确定一个区间,凡是超过这个区间…

那个谷歌的网红扔鸡蛋的题,来看看教科书式的回答

leetcode顶级难题,谷歌面试天天问,来看看吧,带你来一步一步达到最优解。 谷歌不知道问了多少遍,蓝桥杯也出现过,leetcode上是顶级难题,到底是什么题能如此频繁地出现?我们一探究竟吧。 原题描述…

Python更改数据类型——astype()方法和to_numeric()函数

文章目录明确指定数据的类型通过dtypes属性进行查看创建Pandas对象指定数据类型转换数据类型通过astype()方法强制转换数据的类型通过to_numeric()函数转换数据类型明确指定数据的类型 通过dtypes属性进行查看 import pandas as pddf pd.DataFrame({A: [1, 2, 4],B: [9, -80…

不骗你,没读这一篇,你不可能懂二分

上篇文章讲动态规划获得了80k浏览,这次的二分也值得你们一看,这个系列是特别用心写的,准备出书的哦 动态规划 3.0 引子 图书馆自习的时候,一女生背着一堆书进阅览室,结果警报响了,大妈让女生看是哪本书把警报弄响了,女生把书倒出…

Python之数据合并——【concat()函数、merge()函数、join()方法、combine_first()方法】

文章目录轴向堆叠数据——concat()函数横向堆叠与外连接纵向堆叠与内连接主键合并数据——merge()函数内连接方式外连接方式左连接方式右连接方式其他根据行索引合并数据——join()方法四种连接方式行索引与列索引重叠合并重叠数据——combine_first()方法轴向堆叠数据——conc…

超硬核!操作系统学霸笔记,考试复习面试全靠它

之后会发布基于基础知识的大部分算法的模拟代码合集,敬请关注。 进程基础 进程的基本概念 程序顺序执行的特征: 1)顺序性:处理机严格按照程序所规定的顺序执行,每一步操作必须在下一步操作开始前执行 2)封…

配置tomcat6.0的HTTPS(单向)

利用JDK自带的产生证书的工具 生成证书 建立一个脚本文件,内容如下: set SERVER_DN"CNServer, OUshare, Oshare, Lsz, Sgd, CCN" set CLIENT_DN"CNClient, OUshare, Oshare, Lsz, Sgd, CCN" set KS_PASS-storepass changeit set KE…

Python之数据重塑——【stack()方法和unstack()方法、pivot()方法】

文章目录重塑层次化索引对于单层索引的DataFrame类对象stack()方法unstack()方法对于多层索引的DataFrame类对象辨析操作内层索引与外层索引的区别查看多层索引对象转换后的类型轴向旋转——pivot()方法重塑层次化索引 Pandas中重塑层次化索引的操作主要是stack()方法和unstac…

超硬核!学霸把操作系统经典算法给敲完了!要知行合一

上期的笔记,浏览快1万了,既然关注的人很多,那就发出来承诺过的算法全模拟,希望帮到你们。 上期的操作系统学霸笔记,考试复习面试全靠它 一、模拟进程调度 功能 data.h #ifndef _Data_h_ #define _Data_h_#include …

Python之数据转换——【rename()方法、cut()函数、get_dummies()函数】

文章目录重命名轴索引离散化连续数据哑变量处理类别型数据重命名轴索引 rename( self, mapper: Optional[Renamer] None, *, index: Optional[Renamer] None, columns: Optional[Renamer] None, axis: Optional[Axis] None, copy: bool True, inplace: bool False, level…

超硬核!数据结构学霸笔记,考试面试吹牛就靠它

上次发操作系统笔记,很快浏览上万,这次数据结构比上次硬核的多哦,同样的会发超硬核代码,关注吧。 超硬核!操作系统学霸笔记,考试复习面试全靠它 第一次笔记(复习c,课程概述&#xff…

Python之数据拆分——groupby()方法

文章目录groupby()方法通过列名进行分组通过Series对象进行分组Series对象与原数据的行索引长度相等Series对象与原数据的行索引长度不等通过字典进行分组按照columns轴的方向进行分组按照index轴的方向进行分组通过函数进行分组groupby()方法 groupby( self, byNone, axis0, l…

超硬核!小白读了这篇文章,就能在算法圈混了

作为一只超级硬核的兔子,从来不给你说废话,只有最有用的干货!这些神级算法送给你 目录 第一节 1.1bogo排序 1.2位运算 1.3打擂台 1.4morris遍历 第二节 2.1睡眠排序 2.2会死的兔子 2.3矩阵快速幂 2.4摔手机/摔鸡蛋 时空复杂度目录 …

Python之数据聚合——aggregate()方法

文章目录使用内置统计方法聚合数据面向列的聚合方法aggregate()方法对每一列数据应用同一个函数对某列数据应用不同的函数对不同列数据应用不同函数使用内置统计方法聚合数据 实现数据拆分成组并分别计算平均数的操作 代码: import pandas as pd import numpy as…

超硬核十万字!全网最全 数据结构 代码,随便秒杀老师/面试官,我说的

本文代码实现基本按照《数据结构》课本目录顺序,外加大量的复杂算法实现,一篇文章足够。能换你一个收藏了吧? 当然如果落下什么了欢迎大家评论指出 目录 顺序存储线性表实现 单链表不带头标准c语言实现 单链表不带头压缩c语言实现 约瑟…

Python之分组级运算——【transform()方法、apply()方法】

文章目录数据转换——transform()方法数据应用——apply()方法数据转换——transform()方法 使用aggregate()方法进行聚合运算已经在上一篇博客中详细阐述,我们知道aggregate()方法返回的数据集的形状(shape)与被分组的数据集的形状是不同的…

java限制在同一台电脑上只允许有一个用户登录系统

在web应用系统中,出于安全性考虑,经常需要对同一客户端登录的用户数量和一个客户同时在多个客户端登陆进行限制。 具体一点就是: 1、在同一台电脑上一次只允许有一个用户登录系统; 2、一个用户在同一时间只允许在一个客户端登录…

Matplotlib——绘制图表

文章目录通过figure()函数创建画布通过subplot()函数创建单个子图通过subplots()函数创建多个子图通过add_subplot()方法添加和选中子图添加各类标签绘制常见图表绘制直方图——hist()函数绘制散点图——scatter()函数绘制柱状图——bar()函数设定线条的相关参数本地保存图片通…

限制在同一台电脑上只允许有一个用户登录系统

在web应用系统中,出于安全性考虑,经常需要对同一客户端登录的用户数量和一个客户同时在多个客户端登陆进行限制。 具体一点就是: 1、在同一台电脑上一次只允许有一个用户登录系统; 2、一个用户在同一时间只允许在一个客户端登录…