Pandas教程(四)—— 分层索引及数据联合

1.分层索引

分层索引就是在一个轴上拥有多个(两个及以上)索引级别,能以低维度形式处理高维度数据。

行索引有两层

 1.1 分层索引的创建

   1.1.1 方式一:直接设置

  • 1)在创建series、dataframe或读取文件时时,行名或列名输入一个二维的列表;
  • 2)使用语句:data.set_index( )    括号中输入一个含多个列名的列表

     set_index会生成一个新的dataframe,使用一个或多个列作为索引

     reset_index是它的反函数,分层索引中的索引层级会被移动到列中

import pandas as pd
data = {"城市":["北京","上海","深圳","广州"],
         "同比":[120.7,127.3,119.4,140.9],
         "环比":[101.5,101.2,101.3,120.0],
         "定基":[121.4,127.8,120.0,145.5]}

# 法一
data1 = pd.DataFrame(data,
                    index = [["A","A","B","B"],[1,2,1,4]],  #第一层中相同的要放在一起
                    columns =["城市","同比","环比","定基"])

# 法二
data2 = pd.DataFrame(data,columns =["城市","同比","环比","定基"])
data2 = data2.set_index(['城市','同比'])

输出结果如下:

我们得到的就是一个以 MutiIndex 对象 作为索引的 美化视图

print(data.index) #打印dataframe的索引

返回结果如下: 

   1.1.2 利用方法属性创建 

  • 以下方法只是创建出多维索引 Mutiindex 对象,还需要在定义时将其赋给Dataframe

       创建语法:pd. MutiIndex.下述方法()

方法描述
from_arrays接收一个多维数组,高维指定高层索引,低维指定底层索引
from_tuples

接收一个元组的列表,每个元组指定每个对应索引

(高维索引,低维索引)    如上图

from_product接收一个可迭代对象的列表,使用笛卡尔积的方式创建
  • 补充:笛卡尔积

两个集合X和Y的笛卡尔积(X × Y)是指  第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员

例如:A={a, b},B={0, 1, 2},则笛卡尔积为{(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}

import pandas as pd
# 利用数组设置
mult1 = pd.MultiIndex.from_arrays([['a', 'a', 'b', 'b'], [1, 2, 1, 2]],names = ["x","y"])
print(mult1)

# 利用元组设置
mult2 = pd.MultiIndex.from_tuples([('a', 1),('a', 2),('b', 1),('b', 2)],names = ["x","y"])
print(mult2)

# 推荐:利用可迭代对象设置
mult3 = pd.MultiIndex.from_product([[2019,2020],[1,2]])
mult3.names = ["年","月"] # 也可以这样设置索引名
print(mult3)


# 将mutiindex赋给数据
mult4 = pd.MultiIndex.from_product([["山东","北京"],["土豆","茄子"]],names=['城市', '蔬菜'])
data = pd.DataFrame(np.random.random(size=(4,4)),
                    index = mult3,
                    columns = mult4)
print(data)

 1.2 分层索引的切片或索引

    首先我们先创建一个多层索引的dataframe,并以此为例讲解

(参考了该文章:https://blog.csdn.net/qq_35318838/article/details/102469320)

import pandas as pd
mult3 = pd.MultiIndex.from_product([[2019,2020],[1,2]])
mult3.names = ["年","月"]
mult4 = pd.MultiIndex.from_product([["山东","北京"],["土豆","茄子"]],names=['城市', '蔬菜'])
data = pd.DataFrame(np.random.random(size=(4,4)),index = mult3,columns = mult4)
print(data)
上述代码结果
    1.2.1 对列标签层次化索引
  • 最外层列标签的索引:data  [ "外层列名" ] 
  • 内层列标签的索引:   data [ "外层标签","内层标签" ]
print(data["山东"]) # 索引山东列
print("-"*50)
print(data["山东","土豆"]) #索引山东的土豆列

    1.2.2 对行标签层次化索引
  • 最外层行标签的索引:data.loc  [ "外层行名" ] 
  • 内层行标签的索引:   data.loc [ "外层标签","内层标签" ]
print(data.loc[2019]) # 索引2019年 行
print("-"*50)
print(data.loc[2019,1]) # 索引2019一月 行

    1.2.3 使用xs进行索引

      pandas 中的 xs 方法在索引时可以直接指定层次化索引中元素和层级 

  • 语法:data.xs( x ,  level=, axis=1)

参数说明:

          x:标签或标签的元组

          level:层级名(本例中行索引层级包括:蔬菜、城市          列索引层级包括:年、月)

          axis:哪个轴向上的层级

print(data.xs(1,level="月",axis=0)) # 列切片 月层级上所有1月
print("-"*50)
print(data.xs("土豆",level="蔬菜",axis=1))  # 行切片 蔬菜层级上所有土豆

    1.2.4 使用loc和slice方法切片

    在列索引中,“ :”代表选取全部列,但冒号不能在行索引中使用;

    行索引中应该使用slice(None)代表选取所有行

print(data.loc[(slice(None),1),:]) # 选取所有1月
print(data.loc[slice(None),(slice(None),"茄子")]) # 选取所有的茄子

 1.3 重排序和层级排序

方法描述
data.swaplevel(“key1”,“key2”)传入两个层级序号或层级名称,互换这两个层级的位置
data.sort_index(level =)传入一个层级,使结果按照层级进行字典排序

2.联合与合并数据集

  • 基础知识:四种连接方式

        内连接(inner)、左连接(left)、右连接(right)、全外连接(outer  全部都要)

内连接、左连接、右连接

 2.1 Merge函数

   merge函数有点类似sql中的join,主要用于将两个Dataframe根据一些共有的列连接起来

  • 语法: pd.merge(data1,data2,参数) 

常用参数:

         

           how: 数据连接的方式:inner(默认)、left、right、outer(即上面四种)

           on:    用来连接的列名,必须是在两边的df中都有的列名;若使用多个键进行合并,

                       传入一个含多个列名的列表,把多个键看作一个元组数据当作单个键处理即可

           

           suffixes:对于左右表中的重名列,添加后缀进行区分,默认为("_x","_y")

           left_on / right_on:  左(右)表中用作连接键的列名

           left_index / right_index: 将左(右)表的行索引index用作连接键,布尔值 默认F    

   2.1.1 根据单个连接键合并
  • pd.merge(数据1,数据2,on='姓名',how='inner')
import pandas as pd
数据1= pd.DataFrame({'姓名':['叶问','李小龙','孙兴华','李小龙','叶问','叶问'],'出手次数1':np.arange(6)})
数据2 = pd.DataFrame({'姓名':['黄飞鸿','孙兴华','李小龙'],'出手次数2':[1,2,3]})
数据3 = pd.merge(数据1,数据2,on='姓名',how='inner')
print(数据3)
以姓名为连接键,进行内连接

   2.1.2 根据多个连接键合并
  • 根据多个键进行合并时,on参数需传入一个含多个列名的列表,把多个键看作一个元组数据当作单个键处理即可
import pandas as pd
数据1 = pd.DataFrame({'姓名': ['张三', '张三', '王五'],'班级': ['1班', '2班', '1班'],'分数': [10,20,30]})
数据2 = pd.DataFrame({'姓名': ['张三', '张三', '王五','王五'],'班级': ['1班', '1班', '1班','2班'],'分数': [40,50,60,70]})

数据3 = pd.merge(数据1,数据2,on=['姓名','班级'],how='outer',suffixes=('_left','_right'))   # 外连接(并集)的结果
print(数据3)
以姓名和班级作为连接键,进行外连接,并处理了重复名

   2.1.3 索引作为键进行合并
  • 如果我们希望以df的索引作为合并的键,只需传递参数 left_index / right_index = True 即可
import pandas as pd
import numpy as np
data1 = pd.DataFrame({"key1":["Ohio","Ohio","Ohio","Nevada","Nevada"],
                      "key2":[2000,2001,2002,2001,2002],
                      "data":np.arange(5)})

data2 = pd.DataFrame(np.arange(12).reshape(6,2),
                     index = [["Nevada","Nevada","Ohio","Ohio","Ohio","Ohio"],
                              [2001,2000,2000,2000,2001,2002]],
                     columns = ["first","second"])

data3 = pd.merge(data1,data2,left_on=["key1","key2"],right_index=True,how="outer")
print(data3)
data2以多层索引为连接键,进行外连接

 2.2 join函数

      join函数可以便捷的进行横向连接,它默认以索引为连接键,且默认左连接

  • 语法:left_data . join(right_data,on = None,how = 'left') 
  • 若要一次组合多个dataframe,只需传入一个列表即可。例如:result = left.join([right, right2]) 
import pandas as pd
left = pd.DataFrame({'姓名1':['叶问','李小龙','孙兴华'],'年龄1':[127,80,20]})
right = pd.DataFrame({'姓名2':['大刀王五','霍元甲','陈真'],'年龄2':[176,152,128]})

print(left.join(right))

 2.3 concat函数

       contact函数主要负责数据组合中的拼接、绑定或堆叠,也可以总结为沿轴向对数据进行连接

  • 语法:contact([ data1,data2... ],axis = ,join = ,keys = ...)

 常用参数:

 

                 axis :沿哪个轴进行数据连接,默认为0,纵向连接

                 join :选择连接方式,inner(默认)或outer

                 join_axes可以指定根据那个轴来对齐数据,代替join的作用

                 ignore_index:是否忽略原索引,产生一段新的索引(默认False,不忽略)

                 keys:输入一个列表,增加一个区分数据组的键,形成分层索引

 

    2.3.1 纵向拼接 / 分层索引

      contact函数默认(axis = 0)就是纵向拼接,即首尾相连

      此时我们可以通过 添加一个keys或传入字典 来区分拼接后的数据到底来自哪个表

  • 语法1:contact([ df1,df2,df3 ],axis = 0,keys=['x', 'y', 'z']) 
  • 语法2:contact('x': df1,  'y': df2,  'z': df3 },axis = 0)

 

    2.3.2 横向拼接 / 指定拼接键

      当axis = 1的时候,concat就是行对齐,即横向合并

      我们也可以通过传入join_axes,来指定根据那个轴来对齐数据

  • 语法:pd.concat ( [ df1, df4 ] , axis = 1 ,  join_axes = [df1.index] )
根据df1的index 对齐数据

    2.3.3 无视原来的index

        如果两个表的index都没有实际含义,或拼接后变得混乱,我们可以传入 ignore_index 参数来生成一个新的index 

  • 语法: pd.concat ( [ df1, df4 ] , axis = 1 , ignore_index = True)

 

 2.4 联合重叠的数据 

      在数据操作中,我们经常需要去联合一些重叠的数据,进而去填补一些缺失值

 

  • 方法一:np.where(condition,x,y) 等价于 x if condition else y

       语法:np.where(pd.isnull(data1),data2,data1) 

该语法相当于先判断data1中的数据是否为空值,如果为空就用data2的数据,如果不为空,就用data1的数据 

  • 方法二:combine_first

       语法:data1.combine_first(data2)

改语法是逐列对df做相同的操作,可以认为是根据data2 来修补 data1的缺失值

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

简单FTP客户端软件开发——VMware安装Linux虚拟机(命令行版)

VMware安装包和Linux系统镜像: 链接:https://pan.baidu.com/s/1UwF4DT8hNXp_cV0NpSfTww?pwdxnoh 提取码:xnoh 这个学期做计网课程设计【简单FTP客户端软件开发】需要在Linux上配置 ftp服务器,故此用VMware安装了Linux虚拟机&…

【css】实现渐变文字效果(linear-gradientradial-gradient)

效果图 实现方法 关键代码: background: linear-gradient(0deg,#d3ae13 0%,white 44%);-webkit-background-clip: text;-webkit-text-fill-color: transparent;注释掉:-webkit-background-clip: text;这行之后,下图就是待叠加的样式。&#…

【BIG_FG_CSDN】C++ 数组与指针 (个人向——学习笔记)

一维数组 在内存占用连续存储单元的相同类型数据序列的存储。 数组是静态存储器的块;在编译时确定大小后才能使用; 其声明格式如下: 元素类型 数组名[常量];元素类型:数组中元素的数据类型; 常量&#…

vue+ts element-plu是页码器根据屏幕宽度变化,解决刷新后初始化值问题

实现思路&#xff1a;组件挂载后执行初始化操作&#xff0c;初始化添加事件监听器&#xff0c;当浏览器窗口大小发生变化时会调用这个函数handleResize <el-pagination v-model:current-page"currentPage" background :total"total" layout"prev,…

信号与线性系统翻转课堂笔记20——系统函数与信号流图

信号与线性系统翻转课堂笔记20——系统函数与信号流图 The Flipped Classroom20 of Signals and Linear Systems 对应教材&#xff1a;《信号与线性系统分析&#xff08;第五版&#xff09;》高等教育出版社&#xff0c;吴大正著 一、要点 &#xff08;1&#xff09;了解信…

C++多态性——(1)初识多态

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 苦难和幸福一样&#xff0c;都是生命盛…

2024.1.1每日一题

LeetCode每日一题 新的一年开始了&#xff0c;祝大家新年快乐&#xff0c;坚持做每日一题。 1599.经营摩天轮的最大利润 1599. 经营摩天轮的最大利润 - 力扣&#xff08;LeetCode&#xff09; 题目描述 你正在经营一座摩天轮&#xff0c;该摩天轮共有 4 个座舱 &#xff0…

RK3568平台 Android13 GKI架构开发方式

一.GKI简介 GKI&#xff1a;Generic Kernel Image 通用内核映像。 Android13 GMS和EDLA认证的一个难点是google强制要求要支持GKI。GKI通用内核映像&#xff0c;是google为了解决内核碎片化的问题&#xff0c;而设计的通过提供统一核心内核并将SoC和板级驱动从核心内核移至可加…

Go语言实战:如何使用Timeout Context优雅地取消任务

Go语言实战&#xff1a;如何使用Timeout Context优雅地取消任务 引言Go语言和并发编程简介什么是ContextTimeout Context的原理实战演示最佳实践和注意事项总结 引言 在现代软件开发中&#xff0c;尤其是在处理高并发系统时&#xff0c;正确地管理和取消正在进行的任务成为一项…

电子电器架构(E/E)演化 —— 车载以太网

电子电器架构&#xff08;E/E&#xff09;演化 —— 车载以太网 我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 本文13000字。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 屏蔽力是信息过载时代一…

Serverless Framework:开发无服务器应用的最佳工具 | 开源日报 No.133

serverless/serverless Stars: 45.6k License: MIT 该项目是 Serverless Framework&#xff0c;它是一个命令行工具&#xff0c;使用简单易懂的 YAML 语法部署代码和云基础设施以满足各种无服务器应用程序需求。支持 Node.js、Typescript、Python、Go 等多种编程语言&#xff…

Python+Django 构建实验室药品管理和预警系统【源码】

人生苦短&#xff0c;我用 Python。 今天给大家分享一个完整的实战案例&#xff1a;Python实现实验室药品管理和预警系统&#xff0c;文末附完整代码! 在线演示环境 项目演示地址&#xff1a;http://101.34.18.118:8002/ &#xff08;图片未压缩&#xff0c;所以加载有点慢&…

自己的发展安排 2024年 -- 2025年

一、只有一件大事 完成自营软件&#xff0c;坚持运营一整年。 2019年末到现在&#xff0c;4年左右的努力和等待&#xff0c;自己终于迎来了一个巨大的机会&#xff0c;我要全力以赴。 二、我的关注点和思考点 我要将头脑集中在思考自己应用场景 和 AI大模型的结合上。大模型…

Spring Cloud Gateway + Nacos 灰度发布

前言 本文将会使用 SpringCloud Gateway 网关组件配合 Nacos 实现灰度发布&#xff08;金丝雀发布&#xff09; 环境搭建 创建子模块服务提供者 provider&#xff0c;网关模块 gateway 父项目 pom.xml 配置 <?xml version"1.0" encoding"UTF-8"?…

JavaScript的三种引入的方式

目录 (一).什么是JS1.1JS的特点1.2JS的组成 (二).JS引用的三种方式2.1标签引用&#xff08;或嵌入式)2.2文件引用&#xff08;外链式&#xff09;2.3行内式 (三).JS三种引用方式的优缺点1.行内方式&#xff1a;2.标签引用&#xff08;或嵌入式&#xff09;&#xff1a;3.文件引…

从0到1入门C++编程——02 通讯录管理系统

文章目录 一、创建结构体及菜单显示二、添加联系人三、显示联系人四、删除联系人五、查找联系人六、修改联系人七、清空联系人八、退出通讯录 本文通过C实现一个通讯录管理系统&#xff0c;系统要实现的功能如下。 1、添加联系人&#xff1a;向通讯录中添加新人&#xff0c;信息…

【2023年终总结:轻舟已过万重山】

&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308; 欢迎关注公众号&#xff08;通过文章导读关注&#xff09;&#xff0c;发送【资料】可领取 深入理解 Redis 系列文章结合电商场景讲解 Redis 使用场景、中间件系列…

【CF比赛记录】—— Good Bye 2023(A、B、C)

&#x1f30f;博客主页&#xff1a;PH_modest的博客主页 &#x1f6a9;当前专栏&#xff1a;CF比赛记录 &#x1f48c;其他专栏&#xff1a; &#x1f534;每日一题 &#x1f7e1; cf闯关练习 &#x1f7e2; C语言跬步积累 &#x1f308;座右铭&#xff1a;广积粮&#xff0c;缓…

【Java进阶篇】 ClassNotFoundException和NoClassDefFoundError的区别是什么?

ClassNotFoundException和NoClassDefFoundError的区别 ✔️典型解析✔️扩展知识仓✔️NoSuchMethodError ✔️典型解析 ClassNotFoundException是一个受检异常 (checked exception) 。他通常在运行时&#xff0c;在类加载段尝试加载类的过程中&#xff0c;找不到类的定义时触发…

IBM介绍?

IBM&#xff0c;全名国际商业机器公司&#xff08;International Business Machines Corporation&#xff09;&#xff0c;是一家全球知名的美国科技公司。它成立于1911年&#xff0c;总部位于美国纽约州阿蒙克市&#xff08;Armonk&#xff09;&#xff0c;是世界上最大的信息…