Pandas教程(五)—— 数据分组聚合及批处理

1.GroupBy机制

groupby分为三个步骤 拆分-应用-合并 

  1. 拆分操作是在特定轴向上进行的,dataframe可以在 行方向(axis=0)/  列方向 上分组
  2. 分组后会产生groupby对象,我们就可以将函数应用groupby对象的各个组中,产生新的值
  3. 最终,所有函数的应用结果会合并为一个结果对象

 1.1 数据分组  

   1.1.1 遍历各个分组(了解)

     groupby对象支持迭代,会生成一个包含组名和数据块的2维元组序列

import pandas as pd
road = "E:\python 资料\孙兴华 数据分析教程\Pandas课件\课件\pandas教程\课件026\分组聚合.xlsx"
data = pd.read_excel(road)# 遍历 城市 和 区 这两列
for (i,j),group in data.groupby(["城市","区"]):  #城市列赋值给i,区列赋值给jprint((i,j))print(group)
 

   1.1.2 选择一列或所有列的子集

        对于由DataFrame产生的GroupBy对象,如果用单个列名或一组列名对其进行索引,就能实现选取部分列进行聚合的目的

  • 语法df.groupby([ df列名1,df列名2 ])[ [ gb列名 ] ] . 聚合函数

参数说明:

             黄色部分:dataframe的列名,指要根据哪些列分组;也可传入一个判断语句

                                如:data.序号%2 == 0  一一>  筛选出偶数序号

             红色部分产生的groupby对象的列名,指要对哪些列去做聚合

             蓝色部分聚合的方式

             as_index:是否用分组键作为索引(默认True)

juhe = data.groupby(['城市','区'])[['人数','金额']].sum()
print(juhe)
根据城市和区 分组,对人数和金额以求和方式聚合

   1.1.3 使用字典和series分组

        如果我们的分组信息,是以某种对应关系的方式给定,那么我们就可以利用字典来进行分组

import pandas as pd
road= "E:\python 资料\孙兴华 数据分析教程\Pandas课件\课件\pandas教程\课件026\分组聚合2.xlsx"
data = pd.read_excel(road,index_col='店号') #指定店名这一列,用作行名
print(data)Correspondence = {'1月':'一季度','2月':'一季度','3月':'一季度','4月':'二季度'} #根据对应关系分组
data2 = data.groupby(Correspondence,axis=1) # 传入对应关系,按行分组
print(data2.sum()) # 聚合

   1.1.4 根据函数分组(了解) 

        我们要对哪个列进行分组,就把哪个列设为索引,然后直接在groupby中传入函数即可 

  •  案例:按城市的名字字数进行分组聚合
import pandas as pd
road = "E:\python 资料\孙兴华 数据分析教程\Pandas课件\课件\pandas教程\课件026\分组聚合.xlsx"
data = pd.read_excel(road,index_col='城市') #对哪个列进行分组,就把他设成索引
data2 = data.groupby(len)[['人数','金额']].sum()
print(data2)
分组后 2代表两个字的天津,3代表北京市

   1.1.5 根据索引层级分组 

      这种方式是针对于分层索引的数据集,我们可以在轴索引的某个层级上进行聚合

  • 语法:df.groupby(level = 层级 ,axis = 轴). 聚合函数 
import pandas as pd
road = 'E:\python 资料\孙兴华 数据分析教程\Pandas课件\课件\pandas教程\课件026\分组聚合3.xlsx'
data = pd.read_excel(road,index_col=[0,1])  # 设置分层索引
data2 = data.groupby(level='班级').mean()
print(data2)

 1.2 数据聚合(agg函数)

          聚合是指所有根据数组产生标量值(如mean、sum)的数据转换过程。

          前面我们已经介绍过一些聚合操作,例如count(计数)、sum、mean、prod(乘积),这些方法都已经经过groupby优化,会自动排除NA值 


下面介绍agg函数:

       agg函数一般与groupby配合使用,agg是基于列的聚合操作,而groupby是基于行的 

  • 语法: df.groupby(...). agg(“function”,axis = 0,* args)

 参数及注意事项:

  1. 若不是python内建函数,要以字符串形式输入函数名;若为自建函数,必须用agg接收
  2. func位置可以接收:函数,函数列表,字典{‘行名/列名’:‘函数名’}
  3. args位置用于接收函数的参数

   

   1.2.1 同时使用多个函数聚合

        若要同时使用多个函数,直接agg中传入一个包含多个函数的列表即可(字符串形式)

 我们也可通过传入多个(name,function)元组类型构成的列表,来使name作为聚合后的列名 

import pandas as pd
road = 'E:\python 资料\孙兴华 数据分析教程\Pandas课件\课件\pandas教程\课件026\分组聚合3.xlsx'
data = pd.read_excel(road,index_col=[0,1])  # 设置分层索引data2 = data.groupby(level = 0)["语文"].agg([("均值",'mean'),("总和",'sum')])
print(data2)
根据班级分组后,对语文成绩进行聚合

    1.2.2 不同列上应用不同函数

    若要在不同的列,实现不同的计算,我们可以给agg传递一个 含有列名与函数对应关系的字典 

# 仍然使用前面的数据
correspond = {"语文":"mean","数学":"sum"} # 列和函数的对应关系
data3 = data.groupby(level=0).agg(correspond)
print(data3)
按照班级分组后,计算语文的均值,数学的总和

2. 数据批量处理两板斧 

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

 2.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\数据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)

 2.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 ** 2return BMIdata["BMI"] = data.apply(BMI,axis=1)
print(data)
BMI(部分)

3.数据透视表

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

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

 3.1 pivot_table 

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

https://zhuanlan.zhihu.com/p/31952948https://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)
行索引为主客场,列索引为对手球队

 3.2 数据交叉表

    数据交叉表(crosstab)是数据透视表的一个特殊情况,计算的是分组的频率(count)

  • 语法:pd.crosstab(index,columns,margins = )
# 仍然使用上述数据
data2 = pd.crosstab([data.主客场,data.胜负],data.得分,margins=True)
print(data2)
以主客场 胜负为列索引,得分为行索引的交叉表

 3.3 实现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)

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

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

相关文章

Python基础入门第八课笔记(自定义函数 lambda)

什么时候用lambda表达式? 当函数有一个返回值,且只有一句代码,可以用lambda简写。 2、lanbda语法 lambda 形参 : 表达式 注意: 1、形参可以省略,函数的参数在lambda中也适用 2、lambda函数能接收任何数量的参数但只能…

LeetCode(38)外观数列⭐⭐

「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。 你可以将其视作是由递归公式定义的数字字符串序列: countAndSay(1) "1"countAndSay(n) 是对 countAndSay(n-1) 的描述,然后转换成另一…

Element UI:时间组件,支持开始结束时间任选其一

一、背景 Element-UI中时间段组件el-date-picker,需要开始时间和结束时间都选择上,但是业务场景更多的是区间中可以只选择其中一个或开始时间和结束时间都选择 1.el-date-picker:开始时间与结束时间必须同时选择 2.业务需求:开…

计算机创新协会冬令营——暴力枚举题目06

我给大家第一阶段的最后一道题就到这里了,下次得过段时间了。所以这道题简单一点。但是足够经典 下述题目描述和示例均来自力扣:两数之和 题目描述 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target …

R2 + PicGo:教你搭建免费图床并实现快速上传和压缩图片

图片是网站中的重要元素,它们可以增加视觉效果,吸引读者的注意力,传达信息和情感。但是,图片也会占用很多的存储空间和流量,如果您使用传统的图床服务,可能会遇到以下问题:费用高昂、速度慢、容…

雨课堂作业整理2

第十九次作业 1.设 G G G 为无环图,如果把 G G G 的每条边都染上颜色,使得相邻的边的颜色不同,则这种染法为边着色。该说法( )。 A.正确 B.错误 2.设 G G G 如下图所示,则 G G G 是 3 3 3 边可着色的…

电商要怎么学?企业如何进行数字化转型打破市场僵局?

电商要怎么学?企业如何进行数字化转型打破市场僵局? 电商的学习需要从多个方面入手,首先需要了解电商的基本概念和原理,包括电商平台的运营模式、商品推广、客户服务等。此外,还需要掌握电商平台的操作技能&#xff0c…

[ABAP] 修改SAP网页端登录界面

文章目录 前言一、配置服务二、Class实现1. 创建类2. 重写方法 三、测试四、附 - 自动登录 前言 我们在SICF配置一些HTTP服务使用之后使用时,打开网页会提示输入账号密码,但是这个会以弹窗形式出现。 这对客户体验是很不友好的,这篇文章将会…

经典目标检测YOLO系列(一)YOLOV1的复现(1)总体架构

经典目标检测YOLO系列(一)实现YOLOV1网络(1)总体架构 实现原版的YOLOv1并没有多大的意义,因此,根据《YOLO目标检测》(ISBN:9787115627094)一书,在不脱离YOLOv1的大部分核心理念的前提下,重构一款较新的YOLOv1检测器,来…

web学习笔记(九)

目录 1.初识JS(JavaScript) 1.1什么是JavaScript? 1.2HTML5 CSS3 javaScript三者的关系 1.3 JAVAScript的作用 1.4JAVAScript的组成部分 1.5JS注释 1.6补充知识 2.JS的引入方法 2.1行内式 2.2嵌入式(内嵌式) 2.3外链式 3.输入和…

支持API文档生成,API管理工具:Apipost

随着数字化转型的加速,API(应用程序接口)已经成为企业间沟通和数据交换的关键。而在API开发和管理过程中,API文档、调试、Mock和测试的协作显得尤为重要。Apipost正是这样一款一体化协作平台,旨在解决这些问题&#xf…

LeetCode(31) 下一个排列

整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列。 例如,arr [1,2,3] ,以下这些都可以视作 arr 的排列:[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1] 。 整数数组的 下一个排列 是指其整数的下一个字典序更大的排列。更正式地&#xf…