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_music0 95 791 96 902 85 853 93 924 84 905 88 706 59 897 88 868 89 74#对音乐课和数学课逐列求成绩平均分>>> df.apply(np.mean)score_math 86.333333score_music 83.888889dtype: 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.01 93.02 85.03 92.54 87.05 79.06 74.07 87.08 81.5dtype: 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_music0 90 741 91 852 80 803 88 874 79 855 83 656 54 847 83 818 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.333333score_music 83.888889dtype: float64>>> df.apply('mean')score_math 86.333333score_music 83.888889dtype: float64 |
2)应用多个函数,可将函数放于一个列表中;
例:对两门课分别求最高分与最低分
|
1
2
3
4
5
6
7
8
|
>>> df.agg(['max','min']) score_math score_musicmax 96 92min 59 70>>> df.apply([np.max,'min']) score_math score_musicamax 96 92min 59 70 |
3)使用字典可以对特定列应用特定及多个函数;
例:对数学成绩求均值和最小值,对音乐课求最大值
|
1
2
3
4
5
|
>>> df.agg({'score_math':['mean','min'],'score_music':'max'}) score_math score_musicmax NaN 92.0mean 86.333333 NaNmin 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_music0 8.666667 -4.8888891 9.666667 6.1111112 -1.333333 1.1111113 6.666667 8.1111114 -2.333333 6.1111115 1.666667 -13.8888896 -27.333333 5.1111117 1.666667 2.1111118 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.91 9.666667 9.6 6.111111 9.02 -1.333333 8.5 1.111111 8.53 6.666667 9.3 8.111111 9.24 -2.333333 8.4 6.111111 9.05 1.666667 8.8 -13.888889 7.06 -27.333333 5.9 5.111111 8.97 1.666667 8.8 2.111111 8.68 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_music0 95.00 79.001 96.00 90.002 85.00 85.003 93.00 92.004 84.00 90.005 88.00 70.006 59.00 89.007 88.00 86.008 89.00 74.00>>> df['score_math'].map(lambda x:'%.2f'%x)0 95.001 96.002 85.003 93.004 84.005 88.006 59.007 88.008 89.00Name: 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聚合函数与数据分组
我们最常需要的是汇总数据而不是把他们实际检索出来 确定表中行数(或满足某个条件或包含某个特定值的行数) 确定表中行组的和 找出表列(或所有行或特定列)的最大值,最小值和平均值 聚集函数是运行在行组上, ...
随机推荐
- 关于JS继承
关于JS继承 关于继承这个概念,是由面向对象衍生出来的.而JS身为一种基于面向对象而设计的语言,它和正统的面向对象语言又是有差别的. 面向对象语言 身为面向对象语言需要对开发者提供四种能力: ①:封装 ...
- IDEA 配置安卓(Android)开发环境
今天用idea配了一下环境,安装了SDK和Gradle.找了一些学习的资源,明天正式开始学习,配置环境的(3条消息) 用IntelliJ IDEA 配置安卓(Android)开发环境(一条龙服务,新手 ...
- 我遇到移动端ios系统遇到的一些坑和解决办法
我是作为一个H5移动端开发.主要是做跨平台兼容ios系统和Android系统. 在移动端中,最让我头疼的不是功能,不是业务逻辑.而是适配.俗话说:移动端适配是最头疼的事情,也是头发掉得最快的时候. 我 ...
- Eureka单机&集群配置
目录 Eureka是什么 自我保护机制 版本选择 服务搭建 创建项目 导入GAV坐标 application启动类添加注解 配置yml 启动项目 集群配置 修改上面的yml 打jar包到另外一台电脑O ...
- 手写 Vue 系列 之 从 Vue1 升级到 Vue2
前言 上一篇文章 手写 Vue 系列 之 Vue1.x 带大家从零开始实现了 Vue1 的核心原理,包括如下功能: 数据响应式拦截 普通对象 数组 数据响应式更新 依赖收集 Dep Watcher 编 ...
- 图解|用好MySQL索引,你需要知道的一些事情
我是蝉沐风. 这一篇文章来聊一聊如何用好MySQL索引. 为了更好地进行解释,我创建了一个存储引擎为InnoDB的表user_innodb,并批量初始化了500W+条数据.包含主键id.姓名字段(na ...
- 用协程实现高并发I/O(async)
对于并发要求比较法的I/O需求,可以用python的协程去处理. 重点: 1启动协程必须做一次函数调用 2协程激活只占用1kb内存,所以协程很多也问题不大 3这种效果需要使用关键字async和awai ...
- 线程池的极简用法——内置线程池multiprocessing
大家好,今天博主来分享一个线程池的小捷径--内置线程池的使用方法 一.背景 说道多线程,对变成层有了解的小伙伴一定不陌生,虽然不知道是什么但是也会从各大网站.面试分享等途径听说过.这里就不做过多的介绍 ...
- Java基础——类与接口
一.类与接口的关系 1.类与类的关系 继承关系,只能单继承,不能多继承:但是可以多层继承 2.类与接口的关系 实现关系,可以单实现,也可以多实现,还可以继承一个类的同时实现多个接口 3.接口与接口的关 ...
- 使用Xtrabackup 备份mysql数据库
##创建逻辑卷 [root@node1 ~]# pvcreate /dev/sdb1 Physical volume "/dev/sdb1" successfully create ...