5-Pandas数据分组的函数应用(df.apply()、df.agg()和df.transform()、df.applymap())
将自己定义的或其他库的函数应用于Pandas对象,有以下3种方法:
- apply():逐行或逐列应用该函数
- agg()和transform():聚合和转换
- applymap():逐元素应用函数
一 、apply()
其中:设置axis = 1参数,可以逐行进行操作;默认axis=0,即逐列进行操作;
对于常见的描述性统计方法,可以直接使用一个字符串进行代替,例df.apply('mean')等价于df.apply(np.mean);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
>>> df = pd.read_excel('. / input / class .xlsx) >>> df = df[[ 'score_math' , 'score_music' ]] >>> df score_math score_music 0 95 79 1 96 90 2 85 85 3 93 92 4 84 90 5 88 70 6 59 89 7 88 86 8 89 74 #对音乐课和数学课逐列求成绩平均分 >>> df. apply (np.mean) score_math 86.333333 score_music 83.888889 dtype: float64 >>> type (df. apply (np.mean)) < class 'pandas.core.series.Series' > >>> df[ 'score_math' ]. apply ( 'mean' ) 86.33333333333333 >>> type (df[ 'score_math' ]. apply (np.mean)) < class 'pandas.core.series.Series' > #逐行求每个学生的平均分 >>> df. apply (np.mean,axis = 1 ) 0 87.0 1 93.0 2 85.0 3 92.5 4 87.0 5 79.0 6 74.0 7 87.0 8 81.5 dtype: float64 >>> type (df. apply (np.mean,axis = 1 )) < class 'pandas.core.series.Series' > |
apply()的返回结果与所用的函数是相关的:
- 返回结果是Series对象:如上述例子应用的均值函数,就是每一行或每一列返回一个值;
- 返回大小相同的DataFrame:如下面自定的lambda函数。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
#其中的x可以看作是每一类的Series对象 >>> df. apply ( lambda x: x - 5 ) score_math score_music 0 90 74 1 91 85 2 80 80 3 88 87 4 79 85 5 83 65 6 54 84 7 83 81 8 84 69 >>> type (df. apply ( lambda x: x - 5 )) < class 'pandas.core.frame.DataFrame' > |
二、数据聚合agg()
- 数据聚合agg()指任何能够从数组产生标量值的过程;
- 相当于apply()的特例,可以对pandas对象进行逐行或逐列的处理;
- 能使用agg()的地方,基本上都可以使用apply()代替。
例:
1)对两门课逐列求平均分
1
2
3
4
5
6
7
8
|
>>> df.agg( 'mean' ) score_math 86.333333 score_music 83.888889 dtype: float64 >>> df. apply ( 'mean' ) score_math 86.333333 score_music 83.888889 dtype: float64 |
2)应用多个函数,可将函数放于一个列表中;
例:对两门课分别求最高分与最低分
1
2
3
4
5
6
7
8
|
>>> df.agg([ 'max' , 'min' ]) score_math score_music max 96 92 min 59 70 >>> df. apply ([np. max , 'min' ]) score_math score_music amax 96 92 min 59 70 |
3)使用字典可以对特定列应用特定及多个函数;
例:对数学成绩求均值和最小值,对音乐课求最大值
1
2
3
4
5
|
>>> df.agg({ 'score_math' :[ 'mean' , 'min' ], 'score_music' : 'max' }) score_math score_music max NaN 92.0 mean 86.333333 NaN min 59.000000 NaN |
三、数据转换transform()
特点:使用一个函数后,返回相同大小的Pandas对象
与数据聚合agg()的区别:
- 数据聚合agg()返回的是对组内全量数据的缩减过程;
- 数据转换transform()返回的是一个新的全量数据。
注意:df.transform(np.mean)将报错,转换是无法产生聚合结果的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
#将成绩减去各课程的平均分,使用apply、agg、transfrom都可以实现 >>> df.transform( lambda x:x - x.mean()) >>> df. apply ( lambda x:x - x.mean()) >>> df.agg( lambda x:x - x.mean()) score_math score_music 0 8.666667 - 4.888889 1 9.666667 6.111111 2 - 1.333333 1.111111 3 6.666667 8.111111 4 - 2.333333 6.111111 5 1.666667 - 13.888889 6 - 27.333333 5.111111 7 1.666667 2.111111 8 2.666667 - 9.888889 |
当应用多个函数时,将返回于原始DataFrame大小不同的DataFrame,返回结果中:
- 在列索引上第一级别是原始列名
- 在第二级别上是转换的函数名
1
2
3
4
5
6
7
8
9
10
11
12
|
>>> df.transform([ lambda x:x - x.mean(), lambda x:x / 10 ]) score_math score_music < lambda > < lambda > < lambda > < lambda > 0 8.666667 9.5 - 4.888889 7.9 1 9.666667 9.6 6.111111 9.0 2 - 1.333333 8.5 1.111111 8.5 3 6.666667 9.3 8.111111 9.2 4 - 2.333333 8.4 6.111111 9.0 5 1.666667 8.8 - 13.888889 7.0 6 - 27.333333 5.9 5.111111 8.9 7 1.666667 8.8 2.111111 8.6 8 2.666667 8.9 - 9.888889 7.4 |
四、applymap()
applymap()对pandas对象逐元素应用某个函数,成为元素级函数应用;
与map()的区别:
- applymap()是DataFrame的实例方法
- map()是Series的实例方法
例:对成绩保留小数后两位
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
>>> df.applymap( lambda x: '%.2f' % x) score_math score_music 0 95.00 79.00 1 96.00 90.00 2 85.00 85.00 3 93.00 92.00 4 84.00 90.00 5 88.00 70.00 6 59.00 89.00 7 88.00 86.00 8 89.00 74.00 >>> df[ 'score_math' ]. map ( lambda x: '%.2f' % x) 0 95.00 1 96.00 2 85.00 3 93.00 4 84.00 5 88.00 6 59.00 7 88.00 8 89.00 Name: score_math, dtype: object |
从上述例子可以看出,applymap()操作实际上是对每列的Series对象进行了map()操作
通过以上分析我们可以看到,apply
、agg
、transform
三种方法都可以对分组数据进行函数操作,但也各有特色,总结如下:
apply
中自定义函数对每个分组数据单独进行处理,再将结果合并;整个DataFrame的函数输出可以是标量、Series或DataFrame;每个apply
语句只能传入一个函数;agg
可以通过字典方式指定特征进行不同的函数操作,每一特征的函数输出必须为标量;transform
不可以通过字典方式指定特征进行不同的函数操作,但函数运算单位也是DataFrame的每一特征,每一特征的函数输出可以是标量或者Series,但标量会被广播。
5-Pandas数据分组的函数应用(df.apply()、df.agg()和df.transform()、df.applymap())的更多相关文章
- pandas:数据迭代、函数应用
1.数据迭代 1.1 迭代行 (1)df.iterrows() for index, row in df[0:5].iterrows(): #需要两个变量承接数据 print(row) print(& ...
- pandas 数据预处理
pandas 数据预处理 缺失数据处理 csv_data=''' A,B,C,D 1.0,2.0,3.0,4.0 5.6,6.0,,8.0 0.0,11.0,12.0,,''' import pand ...
- pandas学习(数据分组与分组运算、离散化处理、数据合并)
pandas学习(数据分组与分组运算.离散化处理.数据合并) 目录 数据分组与分组运算 离散化处理 数据合并 数据分组与分组运算 GroupBy技术:实现数据的分组,和分组运算,作用类似于数据透视表 ...
- python中pandas数据分析基础3(数据索引、数据分组与分组运算、数据离散化、数据合并)
//2019.07.19/20 python中pandas数据分析基础(数据重塑与轴向转化.数据分组与分组运算.离散化处理.多数据文件合并操作) 3.1 数据重塑与轴向转换1.层次化索引使得一个轴上拥 ...
- pandas数据的分组与分列
读入数据: 数据分组:我们可以看到num这列它的数字在0-20之间变化,我们可以对其增加一列,用来对其分组 df['新增一列的名称']=pd.cut(df['要分组的列'],要分组的区间,新增一列后 ...
- pandas数据查询(数值、列表、区间、条件、函数)
import pandas as pd # 0 读取数据 df = pd.read_csv("文件路径")#例子是北京一年的天气情况 df.head()#查看表头 # 设定索引为日 ...
- 小白学 Python 数据分析(11):Pandas (十)数据分组
人生苦短,我用 Python 前文传送门: 小白学 Python 数据分析(1):数据分析基础 小白学 Python 数据分析(2):Pandas (一)概述 小白学 Python 数据分析(3):P ...
- python数据分析之pandas数据选取:df[] df.loc[] df.iloc[] df.ix[] df.at[] df.iat[]
1 引言 Pandas是作为Python数据分析著名的工具包,提供了多种数据选取的方法,方便实用.本文主要介绍Pandas的几种数据选取的方法. Pandas中,数据主要保存为Dataframe和Se ...
- MySQL聚合函数与数据分组
我们最常需要的是汇总数据而不是把他们实际检索出来 确定表中行数(或满足某个条件或包含某个特定值的行数) 确定表中行组的和 找出表列(或所有行或特定列)的最大值,最小值和平均值 聚集函数是运行在行组上, ...
随机推荐
- 2020ICPC济南站 J.Tree Constructer
题目大意:给定一棵N个顶点的树,顶点为1~N,对于一个序列A1,A2,-,An,若Ai | Aj == 2^60-1,则会连一条边(i,j).要求求出一个序列,可以唯一确定所给定的树. 思路:考虑到树 ...
- Java:安装新版本Java、环境配置
最新版2021年版 Java安装目录 2.在系统变量中设置2项属性,JAVA_HOME.PATH(大小写无所谓),若已存在这点击编辑,不存在则新建 参数为: JAVA_HOME: D:\Java\ ...
- Vue 源码解读(10)—— 编译器 之 生成渲染函数
前言 这篇文章是 Vue 编译器的最后一部分,前两部分分别是:Vue 源码解读(8)-- 编译器 之 解析.Vue 源码解读(9)-- 编译器 之 优化. 从 HTML 模版字符串开始,解析所有标签以 ...
- 从零开始,开发一个 Web Office 套件(7):新的问题—— Click 事件的 z-index
这是一个系列博客,最终目的是要做一个基于 HTML Canvas 的.类似于微软 Office 的 Web Office 套件(包括:文档.表格.幻灯片--等等). 博客园:<从零开始, 开发一 ...
- Python迭代器,生成器,装饰器
迭代器 通常来讲从一个对象中依次取出数据,这个过程叫做遍历,这个手段称为迭代(重复执行某一段代码块,并将每一次迭代得到的结果作为下一次迭代的初始值). 可迭代对象(iterable):是指该对象可以被 ...
- JZ-037-数字在排序数组中出现的次数
数字在排序数组中出现的次数 题目描述 统计一个数字在升序数组中出现的次数. 题目链接: 数字在排序数组中出现的次数 代码 /** * 标题:数字在排序数组中出现的次数 * 题目描述 * 统计一个数字在 ...
- tp5 终端命令总结
D:\PHP\phpstudy_pro\WWW\1906A\tp5>php think build --module examTest Successed D:\PHP\phpstudy_pro ...
- python检查是否有缺失值(有用)以及list,array合并
df.isnull().any() 用来判断某列是否有缺失值 df.isnull().all() 用来判断某列是否全部为空值
- netty通信
学习netty之前,要先了解操作系统中的IO.零拷贝(已经附上链接了) 一.netty的简单介绍 Netty 是由 JBOSS 提供的一个 Java 开源框架,现为 Github 上的独立项目. Ne ...
- 云平台将故障Pod流量下线通用思路与OpenShift操作实战
1 写在前边 自从公司项目前年上了 OpenShift 3.9 私有云平台,更新部署程序的确变得更加容易了.但是带来了很多复杂性,运维实施人员的学习曲线也陡然上升. 上云之前:在项目没上容器云的早期, ...