数据分析:数据处理篇5(1)

多层索引那些事(上)

又和大家见面了,不知道之前的内容大家笑话的怎么样了。这一期就和大家聊聊多层索引的那些事。

多层索引简介

多层索引是Pandas中一个比较核心的概念,允许在一个轴向上拥有多个索引层级,这样的设定会更加方便处理复杂的数据。因此,灵活的处理多层索引也是数据分析的必修课。
那么什么是多层索引呢?献给大家看个例子:

数据分析:数据处理篇5(1)
两层行索引;
数据分析:数据处理篇5(1)
两层列索引。
看过前几篇文章的同学可能会有疑惑:这和使用groupby分组之后生成的内容很像啊!使用上节课的数据进行groupby分类,再使用.size()方法并输出,看看效果:
import pandas as pd
dic = {'ID':[1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011],
        'name':['张三','李四','王五','赵六','孙七','周八','吴九','郑十','张三','王五','郑十'],
        'age':[18,19,20,20,22,22,18,19,19,23,20],
        'class':['大一','大二','大三','大三','研一','研一','大一','大二','大一','大三','大二'],
        'high':[150.00,167.00,180.00,160.00,165.00,168.00,172.00,178.00,175.00,177.00,177.50],
        'gender':['男','女','男','女','男','男','女','男','男','男','男'],
        'hobby':['小提琴','围棋','象棋','羽毛球','游泳','看小说','刷抖音','王者','钢琴','篮球','竖笛']}
df=pd.DataFrame(data = dic,
               index = ['a','b','c','d','e','f','g','h','i','j','k'])
print(df.groupby(['class','gender']).size())

数据分析:数据处理篇5(1)
很像对不对?但是这段代码的输出结果多少和我们之前的图片例子有所不同。不过别急,学完这节课我们就可以把这些都联系起来了。
那没接下来我们开启今天的征程:学会如何处理多层索引的问题。

多层索引的创建

我们先从创建开始,DataFrame和Series都是允许多层索引出现的,我们想要让一组数据带有两个或者更多的索引,只需要按如下代码进行操作:

import pandas as pd

s = pd.Series([1,2,3,4,5,6],index=[['张三','张三','李四','李四','王五','王五'],
                                   ['期中','期末','期中','期末','期中','期末']])
print(s)

import numpy as np

data = np.random.randint(50,100,size=(6,3))

df = pd.DataFrame(data,index=[['张三','张三','李四','李四','王五','王五'],
                             ['期中','期末','期中','期末','期中','期末']],
                      columns=['Java','Web','Python'])
print(df)

数据分析:数据处理篇5(1)
仔细观察我们对行索引的定义:
数据分析:数据处理篇5(1)
从图中数据可以看出,张三那一列是数据的第一层索引,期中那一列是数据的第二层索引,而第二层索引值是和数据一一对应的。不难看出,无论是Series还是DataFrame类型,我们在创建多层索引的时候,名字和考试阶段必须一一对应才行,这无形之中会增加我们的工作量,并且会增加出错误的可能。
Pandas为了解决这个问题,提供了一个创建多层索引的构造方法:pd.MultiIndex.from_product()。我们只需要提供一个装载了去重后索引名的列表就可以创建多层索引了:
import pandas as pd
import numpy as np

data = np.random.randint(50,100,size=(6,3))
names = ['张三','李四','王五']
exam = ['期中','期末']
index = pd.MultiIndex.from_product([names,exam])
df = pd.DataFrame(data,index=index,columns=['Java','Web','Python'])
print(df)

数据分析:数据处理篇5(1)
让我们调换一下name和exam在p.MultiIndex.from_product()方法中的位置,在观察一下结果:
index=pd.MultiIndex.from_product([exam,names])
df = pd.DataFrame(data,index,columns=['Java','Web','Python'])
print(df)

数据分析:数据处理篇5(1)
from_product([exam,names])会将列表中第一个元素作为最外层索引,依次类推;列表中元素值的对应关系,如下图:
数据分析:数据处理篇5(1)
以此类推。有了图,就清晰了很多。接下来我们回收开头的问题:groupby分组之后生成的内容和多层索引又该如何联系起来呢?
使用groupby进行分类,对结果使用.size()方法只完成了分类,输出了每种分类对应的行数。想要把表格完整的输出,我们还需要构建新的DataFrame,代码示意如下:
import pandas as pd
dic = {'ID':[1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011],
        'name':['张三','李四','王五','赵六','孙七','周八','吴九','郑十','张三','王五','郑十'],
        'age':[18,19,20,20,22,22,18,19,19,23,20],
        'class':['大一','大二','大三','大三','研一','研一','大一','大二','大一','大三','大二'],
        'high':[150.00,167.00,180.00,160.00,165.00,168.00,172.00,178.00,175.00,177.00,177.50],
        'gender':['男','女','男','女','男','男','女','男','男','男','男'],
        'hobby':['小提琴','围棋','象棋','羽毛球','游泳','看小说','刷抖音','王者','钢琴','篮球','竖笛']}
df=pd.DataFrame(data = dic,
               index = ['a','b','c','d','e','f','g','h','i','j','k'])
gro=df.groupby(['class','gender'])
a=[]
for i,j in gro:
    a.append(j)
new_df=a[0]
for i in range(1,len(a)):
    new_df=pd.concat([new_df,a[i]], axis=0, join='outer')
print(new_df)

来看看输出:

数据分析:数据处理篇5(1)
确实是我们想要的排序结果,但是打印出来的内容距离我们的期待还有一定差距。我们再使用一下.set_index()方法,重新定义一下行索引:
new_df=new_df.set_index(['class','gender']
print(new_df.set_index(['class','gender']))

数据分析:数据处理篇5(1)
这样看起来是不是就一样了?当然,如果我们也可以把这个表格的行列索引互相调换,只要使用.T就可以了:
pd.set_option('display.max_columns',None)
pd.set_option('max_colwidth',100)
pd.set_option('display.width',1000)
print(new_df.set_index(['class','gender']).T)

数据分析:数据处理篇5(1)
需要注意的一点是,使用set_index方法后,前两列已经是行索引。
这篇文章介绍的内容有些多,因此多层索引的取值和排序问题留到下节再给大家介绍。大家先要先仔细学好多层索引的构建~

Original: https://blog.csdn.net/weixin_54929649/article/details/122360314
Author: 有理想的打工人
Title: 数据分析:数据处理篇5(1)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/679129/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 损失函数 | BCE Loss(Binary CrossEntropy Loss)

    BCE(Binary CrossEntropy)损失函数 * – + 图像二分类问题—>多标签分类 + Sigmoid和Softmax的本质及其相应的…

    人工智能 2023年7月20日
    057
  • Collaborativ

    问题描述 Collaborative filtering(协同过滤)是推荐系统中常用的一种技术,用于预测用户对物品的评分或者推荐物品给用户。在这个问题中,我们将使用协同过滤算法来预…

    人工智能 2024年1月2日
    074
  • 差分进化算法(Differential Evolution)概述

    差分进化算法(Differential Evolution)概述 1 引言 ​最优化方法分为 传统优化方法和 启发式优化方法两大类。 传统优化方法大多利用目标函数的梯度 (或导数)…

    人工智能 2023年6月15日
    0151
  • 基于OpenCV的车牌识别与分割

    基于OpenCV的车牌识别与分割 车牌识别的整个流程分为车牌位置查找, 车牌分割, 字符分割三部分, 车牌位置查找主要基于色彩空间查找的方法, 车牌分割主要基于位置查找之后的车牌二…

    人工智能 2023年6月21日
    085
  • 知识图谱 数据模型和查询语言

    文章目录 * – 1. RDF图数据模型 – + 1.1 资源描述框架RDF + 1.2 RDF图数据模型 + 1.3 RDF Schema(简称RDFS)…

    人工智能 2023年6月4日
    093
  • 课堂笔记| 第八章:模板

    本节课要点: 宏定义 变量模板 函数模板 类模板 变长参数 *在位构造 一、使用宏定义绕开类型的限制 为了绕开类型,解决问题的方法之一是使用C风格的宏定义。 单词:macro 宏 …

    人工智能 2023年6月28日
    0136
  • 爬虫基本原理介绍、实现以及问题解决

    文章目录 一、爬虫的意义 * 1.前言 2.爬虫能做什么 3.爬虫有什么意义 二、爬虫的实现 * 1.爬虫的基础原理 2.api的获取 3.爬虫实现 三、反爬解决方案 * 1.反爬…

    人工智能 2023年7月4日
    077
  • 激光SLAM框架总结

    一、激光SLAM简介 基于激光雷达的同时定位与地图构建技术(simultaneous localization and mapping, SLAM)以其准确测量障碍点的角度与距离、…

    人工智能 2023年5月26日
    095
  • 基于元数据规则的大数据解决方案

    实施大数据分析的目的 随着业务不断横向扩张与数据纵向的不断增多,编写基于事务数据库的跨库跨服务程序解决统计、报表、内容搜索等,越来越麻烦且时效性差。我们需要一个数仓聚合数据解决这些…

    人工智能 2023年6月11日
    0138
  • openCV实践项目:银行卡卡号识别

    本文用于对之前openCV知识点学习的复习及实践。要求达到以下效果: 一、基本流程思路分析 本项目本质上就是进行模板匹配。 注:为多用到所学知识,为了加深理解多加了些步骤,实际上本…

    人工智能 2023年7月4日
    089
  • 【GNN报告】耶鲁大学Rex Ying(应智韬): 双曲表示学习与知识图谱

    目录 1、简介 2、Hyperbolic Embeddings and Knowledge Graphs 背景 双曲空间 知识图谱 ​编辑​编辑 3、参考 1、简介 本人因为关注图…

    人工智能 2023年6月10日
    095
  • 基于python文本挖掘的电商产品评论数据情感分析报告

    背景 近年来,随着互联网的广泛应用和电子商务的迅速发展,网络文本及用户评论分析意义日益凸显,因此网络文本挖掘及网络文本情感分析技术应运而生,通过对文本或者用户评论的情感分析,企业能…

    人工智能 2023年6月19日
    088
  • 携手业内专家赋能AI时代–EpiK铭识协议发起开源知识运动

    携手业内专家赋能AI时代–EpiK铭识协议发起开源知识运动 1月10日,2021开源数据运动线上研讨会成功举办。EpiK邀请清华大学信息技术研究院副院长邢春晓、中国计算机学会知识图…

    人工智能 2023年6月10日
    074
  • 「Python」sklearn

    啊哦~你想找的内容离你而去了哦 内容不存在,可能为如下原因导致: ① 内容还在审核中 ② 内容以前存在,但是由于不符合新 的规定而被删除 ③ 内容地址错误 ④ 作者删除了内容。 可…

    人工智能 2023年7月18日
    063
  • 在半监督学习中,如何选择合适的模型

    如何选择合适的模型在半监督学习中? 半监督学习是机器学习的一个分支,旨在利用有标签和无标签的数据来进行模型训练。与传统的监督学习只利用有标签数据不同,半监督学习通过利用未标记的数据…

    人工智能 2024年1月1日
    038
  • Android + OpenCV 入门教程笔记(保姆级)

    笔记基于Android+openCV培训 进行记录源码:github记录不易,喜欢的可以给个三连,感谢感谢!!! OpenCV概述 什么是OpenCV OpenCV是一个基于Apa…

    人工智能 2023年5月26日
    0115
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球