Pandas进阶--map映射,分组聚合和透视pivot_table详解

文章目录

  • 1.Pandas的map映射
    • (1)映射
    • (2)map充当运算工具
  • 2.数据分组和透视
    • (1)分组统计 - groupby功能 是pandas最重要的功能
    • (2)聚合agg
  • 3.透视表pivot_table
    • (1)参数
    • (2)根据胜负字段进行数据的分组,然后对每组数据进行均值计算
    • (3)根据主客场字段进行数据分类后,对分类后的得分字段求最大值、篮板字段求均值和助攻字段求累加和操作
    • (3)#获取所有队主客场的总得分
    • (4)查看主客场下的总得分都是哪些具体球队的得分构成的
    • (5)#查看主客场下的总得分都是哪些具体球队的得分构成的,对于空值,用0填充
    • (6)多条件分类汇总操作

1.Pandas的map映射

(1)映射

  • 映射就是指给一组数据中的每一个元素绑定一个固定的数据
    给Series中的一组数据提供另外一种表现方式,或者说给其绑定一组指定的标签或字符串

案例1:
创建一个df,两列分别是姓名和薪资。然后给其名字起对应的英文名,然后将英文的性别统一转换为中文的性别
data = pd.DataFrame({“name”:[“tom”,“jeery”,“Alex”,“Jason”],“salary”:[10000,20000,15000,25000],“gender”:[“male”,“female”,“male”,“female”]})
data
在这里插入图片描述

做映射
dic = {
“male”:“男”,
“female”:“女”
}

map可以将gender这组数据中的每个元素根据dic表示的关系,进行映射转换
在这里插入图片描述

data[“性别”]= data[“gender”].map(dic)
data
在这里插入图片描述

案例2:
将文本中的名字映射出英文名字
首先根据本地文件创建个df
在这里插入图片描述

#给每个人起一个英文名,将其作为表格中新的一列存在
dic = {
‘张三’:‘Tom’,
‘李四’:‘Jerry’,
‘王五’:‘Jay’
}#映射关系表
df[‘ename’] = df[‘name’].map(dic)
df

在这里插入图片描述

(2)map充当运算工具

#将每一个人的税后薪资进行计算:超过5000部分的钱需要缴纳25%的税
def after_sal(s): #参数s就依次表示每一个人的薪资数据
return s - (s-5000)*0.25
data[‘after_sal’] = data[‘salary’].map(after_sal)
data
在这里插入图片描述

总结:map传入的参数是个字典,是做映射的。传入的是个函数名,是做运算用的

可以用匿名函数
#匿名函数写法
data[‘after_sal’] = data[‘salary’].map(lambda s: s - (s-5000)*0.25)
data
在这里插入图片描述

当然也可以用apply,新版的没有axis参数了
apply运算效率远远高于map,在数据数量级比较大的时候,经常用apply
在这里插入图片描述

data[“after_sal”]=data[“salary”].apply(lambda x: x - (x - 5000)*0.25)
data
在这里插入图片描述

案例3:
将每个人的入职日期加两年,目前入职日期是字符串类型数据
data = pd.DataFrame({“name”:[“tom”,“jeery”,“Alex”,“Jason”],“salary”:[10000,20000,15000,25000],“gender”:[“male”,“female”,“male”,“female”],“hiredate”:[“2020-10-10”,“2012–9-12”,“2021–4-23”,“2022-05-16”]})
data
在这里插入图片描述

我们用apply来做
获取入职日期,根据- 做切分得到年份,加2
def get_date(x):
year,month,day = x.split(“-”)
year = int(year)+2
return str(year)+“-”+month+“-”+day
data[‘hiredate’] = data[‘hiredate’].apply(get_date)
data
在这里插入图片描述

用map也可以
def get_date(x):
year,month,day = x.split(“-”)
year = int(year)+2
return str(year)+“-”+month+“-”+day
data[‘hiredate’] = data[‘hiredate’].map(get_date)
data
在这里插入图片描述

2.数据分组和透视

分组与聚合通常是分析数据的一种方式,通常与一些统计函数一起使用,查看数据的分组情况

数据分类处理的核心:
groupby()函数
groups属性查看分组情况

(1)分组统计 - groupby功能 是pandas最重要的功能

① 根据某些条件将数据拆分成组
② 对每个组独立应用函数
③ 将结果合并到一个数据结构中

Dataframe在行(axis=0)或列(axis=1)上进行分组,将一个函数应用到各个分组并产生一个新值,然后函数执行结果被合并到最终的结果对象中。

df.groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=False, **kwargs)
api:

学习要善于掌握规律,你不管学什么函数,都要先学习其功能,参数,返回值都是啥。这样才能比较清晰的运用
在这里插入图片描述

参数详解:
by参数用于指定要进行分组的列名,可以是一个列名或者多个列名的列表
axis参数用于指定分组方向,0表示行方向,1表示列方向
level参数用于指定分组级别
as_index参数用于指定分组后的结果是否作为DataFrame的索引
sort参数用于指定分组结果是否按照分组列进行排序
group_keys参数用于指定分组后是否保留分组键
squeeze参数用于指定是否移除单元素的分组
observed参数用于指定是否观察数据的层次结构

import pandas as pd

#加载数据
df = pd.read_csv(‘fruits.csv’).drop(columns=‘Unnamed: 0’)
df
在这里插入图片描述

#想根据不同水果种类对数据进行分组
df.groupby(by=‘item’).groups #使用groupby分组后,调用groups查看分组的结果
Apple是 第0行和第5行。Banada 是第1行和第3行。Orange是第2行和第4行
在这里插入图片描述

#计算不同水果的平均价格
df.groupby(by=‘item’)[‘price’] #单独取出每组数据的价格数据
mean_price = df.groupby(by=‘item’)[‘price’].mean() #求均值
mean_price

在这里插入图片描述

to_dict() 可以将dataframe转换为dict
mean_price.to_dict()
在这里插入图片描述

#将每种水果的平均价格汇总到原始表格中
现在无法直接将平均价格series数据直接插入到原始数据,因为数据结构不一样

此时就可以用到我们之前学的map

dic = {
‘Apple’:3.00,
‘Banana’:2.75,
‘Orange’:3.50
}
#dic = mean_price.to_dict()

df[‘mean_price’] = df[‘item’].map(dic)
df
在这里插入图片描述

#计算不同颜色水果的最大重量
color_max_weight = df.groupby(by=‘color’)[‘weight’].max()
color_max_weight

在这里插入图片描述

将不同颜色水果的最大重量也汇总到原始数据中
df[‘max_weight’] = df[‘color’].map(color_max_weight.to_dict())
df

在这里插入图片描述

使用groupby分组后,也可以使用功能transform和apply提供自定义函数实现更多运算
apply和transform的区别:
transform返回的结果是经过映射后的结果
apply返回的是没经过映射的结果

案例:
计算每种水果最大价格和最低价格的差值

def func(x): # 此时的x是每种水果的所有价格
return x.max()-x.min()

df [‘price_cha’] = df.groupby(by=“item”)[‘price’].transform(func)
df
在这里插入图片描述

此时,用apply就得不到值
在这里插入图片描述

apply得到的值是:

#计算每种水果最大价格和最低价格的差值

def func(x): # 此时的x是每种水果的所有价格
return x.max()-x.min()

df.groupby(by=‘item’)[‘price’].apply(func)

能得到结果,但是没经过映射,没法直接添加到原始数据。还需要转化成字典,使用map才能映射
在这里插入图片描述

#计算每种水果最大价格和最低价格的差值

def func(x): # 此时的x是每种水果的所有价格
return x.max()-x.min()

dic = df.groupby(by=‘item’)[‘price’].apply(func).to_dict()

df[‘price_cha’] = df[‘item’].map(dic)
df
在这里插入图片描述

(2)聚合agg

对分组后的结果进行多种不同形式的聚合操作
#求每种水果的平均价格和最高价格、最低价格
df.groupby(by=‘item’)[‘price’].agg([‘mean’,‘max’,‘min’])
在这里插入图片描述

3.透视表pivot_table

透视表是一种可以对数据动态排布并且分类汇总的表格格式。
或许大多数人都在Excel使用过数据透视表,也体会到它的强大功能,而在pandas中它被称作pivot_table。
在这里插入图片描述

(1)参数

values:被计算的数据项,设定需要被聚合操作的列(需要显示的列) 对哪个值进行计算
index:每个pivot_table必须拥有一个index,必选参数,设定数据的行索引,可以设置多层索引,多次索引时按照需求确定索引顺序。 根据什么分类
columns:必选参数,设定列索引,用来显示字符型数据,和fill_value搭配使用。
aggfunc:聚合函数, pivot_table后新dataframe的值都会通过aggfunc进行运算。默认numpy.mean求平均。
fill_values:填充NA值(设定缺省值)。默认不填充,可以指定。
margins:添加行列的总计,默认FALSE不显示。TRUE显示。
dropna:如果整行都为NA值,则进行丢弃,默认TRUE丢弃。FALSE时,被保留。
margins_name:margins = True 时,设定margins 行/列的名称。‘all’ 默认值

#加载数据
df = pd.read_csv(‘透视表-篮球赛.csv’)
df.head(3)
在这里插入图片描述

#根据对手分类,计算每个球队的平均分
新版的不能对字符串的列进行计算
在这里插入图片描述

必须指定数字的列

df.pivot_table(index=‘对手’,values=‘得分’,aggfunc=‘mean’) #aggfunc默认是mean,求平均
在这里插入图片描述

(2)根据胜负字段进行数据的分组,然后对每组数据进行均值计算

df.pivot_table(index=‘对手’,values=[‘命中’,‘投篮数’,‘投篮命中率’,‘3分命中率’,‘篮板’,‘助攻’,‘得分’])
在这里插入图片描述

默认aggfunc只能举个一个参数,要想聚合多个参数,使用字典 。values这个字段就不要了

(3)根据主客场字段进行数据分类后,对分类后的得分字段求最大值、篮板字段求均值和助攻字段求累加和操作

df.pivot_table(index=‘主客场’,aggfunc={‘得分’:‘max’,‘篮板’:‘mean’,‘助攻’:‘sum’})

在这里插入图片描述

(3)#获取所有队主客场的总得分

df.pivot_table(index=‘主客场’,values=‘得分’,aggfunc=‘sum’)

在这里插入图片描述

(4)查看主客场下的总得分都是哪些具体球队的得分构成的

df.pivot_table(index=‘主客场’,values=‘得分’,aggfunc=‘sum’,columns=‘对手’)
在这里插入图片描述

(5)#查看主客场下的总得分都是哪些具体球队的得分构成的,对于空值,用0填充

df.pivot_table(index=‘主客场’,values=‘得分’,aggfunc=‘sum’,columns=‘对手’,fill_value=0)
在这里插入图片描述

(6)多条件分类汇总操作

df.pivot_table(index=[‘主客场’,‘对手’],values=‘得分’,aggfunc=‘sum’)
在这里插入图片描述

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

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

相关文章

小程序上的h5页面在web上面访问 页面基于vue

前提:BASE_URL: https://ded.toll.keeke.ai/ded-api/ 页面路径是:pages/webview/webview 参数是:id111 列表页跳转到详情页的方法是 toDetail(e) {wx.navigateTo({url: ../webview/webview?id e.currentTarget.dataset.oid})}, vue的映射…

【日常问题】Failed to enable unit: Unit file docker.service does not exist.

Failed to enable unit: Unit file docker.service does not exist. 1. 问题原因 笔者问题的产生是因为在ubuntu20.04下采用snapd安装的docker,因此 systemctl restart docker.servicesystemd并不能找到守护进程docker.service 同时使用docker命令时还会产生若干…

React Router 完美教程(上)

概述 什么叫路由呢,说白了就是如何处理页面的跳转。在传统的网站中,我们都是向服务器请求页面及相应的css和js代码。自从前后端分离的相思提出后,一堆基于js虚拟Dom的框架应运而生。React就是其中优秀的代表作之一。这种方式极大的优化了开发…

Conventional SortSearch

Merge Sort——from bottom to top(iteration) void merge_sort( ElementType list[], ElementType sorted[], int N, int length ){int size1;for(;size<N;size*2){for(int i0;i<N;i2*size){int l1i; int l2sizei;int locl1;while(l1<isize&&l1<N&…

etcd自动化安装配置教程

文章目录 前言一、简介1. 简介2. 特点3. 端口介绍 二、etcd安装教程&#xff08;单机版&#xff09;1. 复制脚本2. 增加执行权限3. 执行脚本4. 查看启动状态5. 卸载etcd 三、etcd安装教程&#xff08;集群版&#xff09;1. 复制脚本2. 增加执行权限3. 分发脚本4. 执行脚本5. 启…

中科大计网学习记录笔记(一):Internet | 网络边缘

计算机网络 前言&#xff1a; 学习视频&#xff1a;中科大郑烇、杨坚全套《计算机网络&#xff08;自顶向下方法 第7版&#xff0c;James F.Kurose&#xff0c;Keith W.Ross&#xff09;》课程 该视频是B站非常著名的计网学习视频&#xff0c;但相信很多朋友和我一样在听完前面…

【JavaSE篇】——内部类

目录 &#x1f393;内部类 &#x1f388;内部类的分类 &#x1f6a9;实例内部类 一.如何实例内部类对象 二.实例内部类中为什么不能有静态成员变量 &#xff08;用final解决&#xff09; 三.在实例内部类对象时&#xff0c;如何访问外部类当中相同的成员变量&#xff1f;…

SpringMVC-基本概念

一、引子 我们在上篇文章Spring集成Web中抛出了一个问题&#xff1a;为什么我们一直在自用Java Web阶段使用的Servlet来承接客户端浏览器的请求呢&#xff0c;我们熟知甚至是已经在日常开发中经常使用的Controller又与之有什么关系呢&#xff1f;我们将在本篇文章解答读者的这…

检测CUDA 是否能访问GPU时回应速度慢【笔记】

SUPWEMICRO 418G-Q20X12 维护记录&#xff1a; 两台设备均已安装CUDA与Pytorch&#xff0c;在检测CUDA 是否能访问GPU&#xff0c;执行torch.cuda.is_available()命令时&#xff0c;一台设备速度秒回应True&#xff0c;但另外一台设备回应速度慢&#xff08;1分钟左右&#xff…

node,node-sass,sass-loader之间的版本关系

前言 安装配置node-sass 以及 sass-loader想必是很多前端的噩梦–一不小心又不成功还得装个半天。 下面说一下这个问题。 当然&#xff0c;你肯定遇到过&#xff1a; Node Sass version 9.0.0 is incompatible with ^4.0.0-这样的问题&#xff0c;这个也是因为三者关系对不上…

【PyQt】02-基本UI

文章目录 前言一、首先了解什么是GUI&#xff1f;二、初学程序1.界面展示代码运行结果 2.控件2.1按钮展示代码运行结果 2.2 纯文本和输入框代码运行结果 3、重新设置大小 -resize4、移动窗口-move()5、设置界面在电脑中央5.1 代码运行结果 6、设置窗口图标代码运行结果 7、布局…

Django模型(二)

一、更新数据库表结构 不管是新增模型,还是修改已有模型后,只需要执行行命令即可: 1.1、创建迁移 在项目根目录的cmd中运行: $ python manage.py makemigrations model_app备注 model_app是子应用的名称,如果不指定,那么就是对所有 INSTALLED_APPS 中的应用都进行预备…

开发数据产品+AI产品通关上岸课程

该课程全面解析数据产品和人工智能产品的开发与设计。学员将学习产品规划、数据分析以及AI技术应用&#xff0c;通过案例实践掌握产品开发流程&#xff0c;致力于帮助他们成功进入数据和人工智能产品领域。 课程大小&#xff1a;9.8G 课程下载&#xff1a;https://download.cs…

Java多线程共享变量控制volatile

1. volatile实现可见性&#xff08;jdk 1.5后&#xff09; 1. 可见性 如果一个线程对共享变量值的修改&#xff0c;能够及时的被其他线程看到&#xff0c;叫做共享变量的可见性。如果一个变量同时在多个线程的工作内存中存在副本&#xff0c;那么这个变量就叫共享变量 volati…

如何从零开始开发一个PS5浏览器 | How to develop a PS5 browser

环境&#xff1a;Windows PS5一台 问题&#xff1a;PS5折腾需要使用PKG浏览器访问特定网址&#xff0c;如何自定义网址呢&#xff1f; 解决办法&#xff1a;使用开发套件PS Multi Tools开发一个空应用&#xff0c;利于deeplinkUri 参数访问网页 背景&#xff1a;PS5折腾后&…

dockerpipwork相关测试过程

pipework可以减轻docker实施过程中的工作量&#xff0c;在网上也找了几篇类似的文章&#xff0c;按照相应配置&#xff0c;结果并不相同 如下测试过程记录下&#xff1a; docker run -it --rm --name c1 busybox docker run -it --rm --name c2 busyboxpipework br1 c1 192…

Altium Designer的学习

PCB设计流程 1.新建空白工程&#xff1a; 创建一个新的工程 新建四个文件&#xff0c;并且保存&#xff1a; 每次打开文件时&#xff0c;打开以.PrjPcb结尾的文件 2.元件符号的创建&#xff1a; 在绘制图形的时候设置成10mil,为了在原理图中显得不那么大。 在绘制引脚的时候设…

拦截器,AOP,自定义注解的使用

自定义注解AOP&#xff0c;实现 进入方法打印参数日志 /*** 定义进入方法前打印日志注解* author zy*/ Target(ElementType.METHOD) Retention(RetentionPolicy.RUNTIME) Documented public interface PrintLog {} /*** 定义一个切面&#xff0c;在使用PrintLog注解的方法进…

Hadoop3.x基础(2)- HDFS

来源&#xff1a;B站尚硅谷 目录 HDFS概述HDFS产出背景及定义HDFS优缺点HDFS组成架构HDFS文件块大小&#xff08;面试重点&#xff09; HDFS的Shell操作&#xff08;开发重点&#xff09;基本语法命令大全常用命令实操准备工作上传下载HDFS直接操作 HDFS的API操作HDFS的API案例…

springboot 怎么设置局域网访问

如何配置Spring Boot应用以实现局域网访问 在开发一个Spring Boot应用时&#xff0c;我们通常会通过localhost来访问和测试我们的应用。但是&#xff0c;当我们想要在局域网中分享我们的应用&#xff0c;供其他设备访问时&#xff0c;仅仅使用localhost是不够的。本文将引导你…