Pandas教程(五)—— 数据重塑透视及批量处理

news2025/2/22 14:00:38

1.数据重塑

重塑数据主要有两种方式,分别是 stack(堆叠)和 unstack(拆堆),他们两个是互逆的操作

函数作用

data.stack( )

堆叠

会“旋转”或将列中的数据透视到行

列 一一> 行

data.unstack( )

拆堆

将行中的数据透视到列 

行 一一> 列

参数说明:

           level:要堆叠的列 / 行的层级,默认为-1(最内层)

           dropna:是否排除缺失的组合。默认为 True

 

import pandas as pd
import numpy as np
data = pd.DataFrame(np.arange(12).reshape(6,2),
                    index = pd.MultiIndex.from_product([["Ohio","Colorado"],["one","two","three"]],names = ["state","number"]),
                    columns = pd.Index(["left","right"],name = "side"))
print(data)
print("-"*35)

# 拆堆 行透视为列
chai = data.unstack("state") # 传入要拆分的层级
print(chai)
print("-"*35)

# 堆叠 列透视为行
dui = chai.stack("side")
print(dui)

上述代码示意图

2.数据透视表

透视表是一种可以对数据动态排布并且分类汇总的表格格式

可以让我们从不同的角度去分析一个大数据库,有点类似于分类筛选的高阶版操作

 2.1 pivot_table 

  该部分笔记参考了以下文章:

https://zhuanlan.zhihu.com/p/31952948icon-default.png?t=N7T8https://zhuanlan.zhihu.com/p/31952948

  • 语法:     

         pivot_table ( data,  index = None,  values = None,  columns = None,  aggfunc = 'mean' )  

常用参数说明: 

                   index:  设置行分层字段,将选中的列设为行索引   👇

                   values:输入一个含列名的列表,筛选我们需要保留的列

                   columns:类似Index设置列分层字段,将选中的列设为列索引   👉

                   aggfunc:设置我们对数据聚合时进行的函数操作,默认为 mean

                   fill_value:替换缺失值

                   drop_na:是否去除所有条目均为NA的列(默认False,不去除)

                   margins:是否添加行 / 列计数 及 总计数(默认False,不添加)

  • 参数使用说明

       下面我们以詹姆斯某赛季的数据为例,来对pivot_table函数进行讲解

  step1  首先导入数据,并展示前五场:

import pandas as pd
import numpy as np
road = "E:\python 资料\孙兴华 数据分析教程\Pandas课件\课件\pandas教程\课件028-029\Lebron_James.csv"
data = pd.read_table(road,sep=",")
print(data.head(5))
詹姆斯比赛数据,前五场

 step2  需要james在主客场和不同胜负情况(index下的得分、篮板与助攻(values三项数据

data1 = pd.pivot_table(data, index=['对手', '主客场'],values=['得分','助攻','篮板'])
print(data1.head(5))
上述代码筛选得到的数据

   step3  我们还想获得james在主客场和不同胜负情况下的得分、篮板、助攻(aggfunc

              此时应该向aggfunc中输入sum函数,按层次求和

# 这里要注意mean不是内置函数,它是numpy中的一个函数
data2 = pd.pivot_table(data, index=['对手', '主客场'],values=['得分','助攻','篮板'],
                       aggfunc=[sum,np.mean])
print(data2.head(5))
总得分、篮板、助攻情况如图

  step4  我们也可以通过columns再设置一个列索引,并且通过margin来汇总

# fill_value填充空值,margins=True进行汇总
data3 =pd.pivot_table(data,index=['主客场'],columns=['对手'],values=['得分'],aggfunc=[np.sum],fill_value=0,margins=1)
print(data3)
行索引为主客场,列索引为对手球队

 2.2 实现excel的vlookup功能

  • 要求:一个excel表中有两个sheet,要求将 sheet1 中的某列,插入到 sheet2 的指定位置 

  • step:
  1.  切片要合并的列 
  2. 将它和sheet2合并
  3. 再在合并的数据中提取出该列,并在合并数据中删除该列
  4. 将提取出的该列插入指定位置
import pandas as pd
road = "E:\python 资料\孙兴华 数据分析教程\Pandas课件\课件\pandas教程\课件028-029\Vlookup.xlsx"
data1 = pd.read_excel(road,sheet_name="花名册")
data2 = pd.read_excel(road,sheet_name="成绩单")

# 将 花名册 与 成绩单中的总分、学号 合并
hebing = pd.merge(data1,data2.loc[:,["学号","总分"]],how = "left",on = "学号")
print(hebing)
print("-" * 40)

# 将总分放到第二列的位置
score = hebing.总分 # 提取出 总分 列
hebing = hebing.drop("总分",axis = 1) # 在原数据中删除该列
hebing.insert(1,"总分",score) # 在原数据第二列插入新列
print(hebing)

3.数据处理两板斧

     在数据处理中,经常会对一个DataFrame进行逐行、逐列和逐元素的操作,对应这些操作,Pandas中的 map \ apply  可以解决绝大部分这样的数据处理需求

 3.1 map

          map会根据提供的函数或字典对指定序列做映射,它更多地适用于简单的批量处理数据,function中的参数最好只有一个

  • 语法:map(字典) 或   data.map(function)或 map(function,data)

  • 案例一:对每个单元格(元素)执行指定的函数操作

             一般使用匿名函数 lambda 去定义函数,进行操作 

import pandas as pd
road = "E:\python 资料\孙兴华 数据分析教程\Pandas课件\课件\pandas教程\课件030-031\数据2.xlsx"
data = pd.read_excel(road)
print(data)
print("-"*40)

data2 = data.map(lambda x:"%.2f" % x) #每个元素保留两位小数
print(data2)
print("-"*40)

data3 = data.map(lambda x: x ** 2) #每个元素的平方
print(data3)
运行结果

  • 案例二:逐行 / 列处理数据

       在原数据中新增两列, 若为男就是先生,若为女就是女士;再根据体重判断体型,若大于80kg就是魁梧,小于80kg就是瘦小

import pandas as pd
road = "E:\python 资料\孙兴华 数据分析教程\Pandas课件\课件\pandas教程\课件030-031\数据.xlsx"
data = pd.read_excel(road)
print(data)
print("-"*40)

# 一:用字典做映射
zidian = {'男':'先生','女':'女士'}
data["称呼"] = data["性别"].map(zidian) #新增一个 称呼 列,若为男就是先生,若为女就是女士
print(data)
print("-"*40)

# 二:用函数做映射
def judge(x):
    result = "魁梧" if x > 80 else "瘦小"
    return result
data["体型"] = data["体重"].map(judge) #根据体重判断体型
print(data)

 3.2 apply

apply() 函数的自由度较高,可以直接对 DataFrame 中元素进行逐元素的遍历操作,方便且高效;与map相比,它可以在一个函数中传入多个参数来使用,适用范围较广(可传入更复杂的函数)

  • 语法data.apply(  function,axis = 0,row = False,arg = (元组))

参数说明:

           axis = :沿哪个轴进行数据处理(默认为0,处理每一列)

           row = :0表示把每一行或列作为 Series 传入函数中;1表示接收ndarry数组

           arg = :若函数有多个参数,则传入一个元组,接收第二至最后一个参数  

 其余说明事项:

  1. 在处理多个参数时,需要用arg参数接收第二至最后一个参数
  2. 在处理多行时,直接在data位置传入 dataframe 或者 df切片后的多列即可
  3. 当axis=1对行进行操作时,会默认将每一行数据以Series的形式(Series的索引为列名)传入指定函数,返回相应的结果;axis = 0同理

  • 案例一:单行或单列进行操作(map也可以完成) 

       要求:仍然使用map中案例二的数据,修改分数:所有人的语文成绩 +5 分 

def score_change(x,y): # x为科目,y为修改值
    return x + y

#arg传入一个元组,接受第二个参数
data["语文"] = data["语文"].apply(score_change,args=(5,)) 

  • 案例二:对多行 / 多列进行操作

  要求:计算每个人(逐行)三科的总成绩,并根据总成绩排序

data["总成绩"] = data[['语文','数学','英语']].apply(sum,axis=1) # 逐行相加

data = data.sort_values (by="总成绩",ascending=False) # 根据总成绩降序排序
print(data)
根据总成绩排序结果(部分)

  • 案例三: 综合运用

       要求:计算每个人的bmi

def BMI(data):
    height = data["身高"]
    weight = data["体重"]
    BMI =weight / height ** 2
    return BMI

data["BMI"] = data.apply(BMI,axis=1)
print(data)
BMI(部分)

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

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

相关文章

AWS(三):如何在AwsManagedAd目录和windowsAD实例之间建立双向信任。

前提: 1.创建好了一个AWS managed AD目录,我的目录域名为:aws.managed.com 2.创建好了一个windows AD实例并提升了为域控服务器,实例域名为:aws2.com 看过我AWS 一和二的应该都会创建windows实例了,切记不能将其无缝加入到aws managed AD的…

(JAVA)-反射

什么是反射? 反射允许对成员变量,成员方法和构造方法的信息进行编程访问。 说简单点就是反射能将类里面的构造方法,成员变量,修饰符,返回值,注解,类型,甚至异常等类里面的所有东西都能够获取出来。 关于C…

打造炫酷粒子效果的前端利器tsParticles

前端潮流速递 :打造炫酷粒子效果的前端利器tsParticles 在现代前端开发中,动画和视觉效果是吸引用户的关键元素之一。而实现炫酷而引人入胜的粒子效果,常常需要耗费大量的时间和精力。然而,有了 tsParticles,这一切变…

GitHub上的15000个Go模块存储库易受劫持攻击

内容概要: 目前研究发现,GitHub上超过15000个Go模块存储库容易受到一种名为“重新劫持”的攻击。 由于GitHub用户名的更改会造成9000多个存储库容易被重新劫持,同时因为帐户删除,会对6000多个存储库造成重新劫持的危机。目前统计…

【MySQL·8.0·源码】MySQL 表的扫描方式

前言 在进一步介绍 MySQL 优化器时,先来了解一下 MySQL 单表都有哪些扫描方式。 单表扫描方法是基表的读取基础,也是完成表连接的基础,熟悉了基表的基本扫描方式, 即可以倒推理解 MySQL 优化器层的诸多考量。 基表,即…

半导体行业-SECS/GEM协议 JAVA与SECS/GEM通信 什么是配方?springboot集成SECS通信协议 配方管理S7FX

Java与SECS基础通信 Java实现SECS指令S2F17获取时间 Java实现SECS指令 S10F3 终端单个显示例子 Java实现SECS指令 S7FX配方管理 Java实现SECS指令 S5F1报警/取消报警上传 实例源码及DEMO请查阅 JAVA开发SECS快速入门资料,SECS S7F19 什么是半导体配方&…

Unity3D UGUI图集打包与动态使用(TexturePacker)

制作图集的好处: 众所周知CPU是用来处理游戏的逻辑运算的,而GPU是用来处理游戏中图像的。在GPU中,我们要绘制一个图像需要提交图片(纹理)到显存,然后再进行绘制(在这个过程中会产生一次DrawCall…

书生-浦路大模型全链路开源体系

2023年,大模型成为热门关键词 论文链接 大模型已经成为发展通用人工智能的重要途经 模型评测过程:从模型到应用 全链条开源开发体系 | 数据: 多模态融合 万卷包含文本、图像和视频等多模态数据,涵盖科技、文学、媒体、教育和法…

力扣hot100 二叉树的层序遍历 BFS 队列

👨‍🏫 题目地址 时间复杂度: O ( n ) O(n) O(n)空间复杂度: O ( n ) O(n) O(n) 😋 队列写法 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode…

Pycharm恢复默认设置

window 系统 找到下方目录-->删除. 再重新打开Pycharm C:\Users\Administrator\.PyCharm2023.3 你的不一定和我名称一样 只要是.PyCharm*因为版本不同后缀可能不一样 mac 系统 请根据需要删除下方目录 # Configuration rm -rf ~/Library/Preferences/PyCharm* # Caches …

vue的小入门

vue的快速上手 Vue概念 是一个用于构建用户界面的渐进式框架优点:大大提高开发效率缺点:需要理解记忆规则 创建Vue实例 步骤: 准备容器引包创建Vue实例new Vue()指定配置项el data>渲染数据 el指定挂载点,选择器指定控制…

OpenCV-14图片的四则运算和图片的融合

一、图片的四则运算 1. 加法运算 通过使用API add来执行图像的加法运算 cv2.add(src1, src2)需要再其中传入两张图片。 图片就是矩阵,图片的加法运算就是矩阵的加法运算。 因此加法运算中要求两张图的shape必须是相同的。 首…

【vue/uniapp】使用 uni.chooseImage 和 uni.uploadFile 实现图片上传(包含样式,可以解决手机上无法上传的问题)

引入: 之前写过一篇关于 uview 1.x 版本上传照片 的文章,但是发现如果是在微信小程序的项目中嵌入 h5 的模块,这个 h5 的项目使用 u-upload 的话,图片上传功能在电脑上正常,但是在手机的小程序上测试就不会生效&#x…

C# windows服务程序开机自启动exe程序

我们使用传统的Process.Start(".exe")启动进程会遇到无法打开UI界面的问题,尤其是我们需要进行开启自启动程序设置时出现诸多问题,于是我们就想到采用windows服务开机自启动来创建启动一个新的exe程序,并且是显式运行。 首先是打开…

19、BLIP-2

简介 github 通过利用预训练的视觉模型和语言模型来提升多模态效果和降低训练成本,预训练的视觉模型能够提供高质量的视觉表征,预训练的语言模型则提供了强大的语言生成能力。 实现过程 为了弥合模态差距,提出了一个分两个阶段预训练的 Qu…

华为端口隔离高级用法经典案例

最终效果: pc4不能ping通pc5,pc5能ping通pc4 pc1不能和pc2、pc3通,但pc2和pc3能互通 vlan batch 2 interface Vlanif1 ip address 10.0.0.254 255.255.255.0 interface Vlanif2 ip address 192.168.2.1 255.255.255.0 interface MEth0/0/1 i…

神经网络:经典模型热门模型

在这里插入代码片【一】目标检测中IOU的相关概念与计算 IoU(Intersection over Union)即交并比,是目标检测任务中一个重要的模块,其是GT bbox与pred bbox交集的面积 / 二者并集的面积。 下面我们用坐标(top&#xff0…

Windows定时重启Tomcat

项目场景: 系统:Windows 7 Tomcat:apache-tomcat-8.0.5 JDK:1.8 问题描述 最近项目的Tomcat隔一段时间就假死,最后想到的解决方式就是:每天凌晨1点重启tomact。 解决方案: 使用Windows系统…

基于SpringBoot的旅游网站

目录 前言 开发环境以及工具 项目功能介绍 用户端: 管理端: 详细设计 用户端首页 登录页面 管理端页面 源码获取 前言 本项目是一个基于IDEA和Java语言开发基于SpringBoot的旅游网站。应用包含管理端和用户端等多个功能模块。 改革开放以来&am…

MatrixOne 1.1.0 Release

我们非常高兴地宣布: MatrixOne内核1.1.0版本 正式发布啦! 项目文档网站 https://docs.matrixorigin.cn MatrixOne是一款分布式超融合异构数据库,MatrixOne旨在提供一个云原生、高性能、高弹性、高度兼容MySQL的HSTAP数据库,让…