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聚合函数与数据分组
我们最常需要的是汇总数据而不是把他们实际检索出来 确定表中行数(或满足某个条件或包含某个特定值的行数) 确定表中行组的和 找出表列(或所有行或特定列)的最大值,最小值和平均值 聚集函数是运行在行组上, ...
随机推荐
- Hadoop权威指南 - 学习笔记
初识Hadoop.关于MapReduce Hadoop宏观介绍 相对于其他系统的优势 关系型数据库管理系统 为什么不能用配有大量硬盘的数据库进行大规模分析?为什么需要Hadoop? 因为计算机硬盘的发 ...
- C#里面操作COM组件
//这种写法是在COM操作里面是很经常见到的 TestDefaultMethod(foo: "test", bar: "test");
- Pandas:to_excel时如何不覆盖之前的Excel表、ExcelWriter类
如果只是想把一个DataFrame保存为单独的一个Excel文件,那么直接写: data.to_excel('xxx.excel','sheet1',index=False) 但是这样做,只会保存为单 ...
- 实战:Spring AOP实现多数据源动态切换
需求背景 去年底,公司项目有一个需求中有个接口需要用到平台.算法.大数据等三个不同数据库的数据进行计算.组装以及最后的展示,当时这个需求是另一个老同事在做,我只是负责自己的部分. 直到今年回来了,这个 ...
- php 23种设计模型 - 桥接模式
桥接模式(Bridge) 桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化.这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦. 这种模式涉 ...
- egg微信小程序支付(服务商)插件封装
下单 通过下单获取prepay_id,然后返回给小程序发起支付 若是服务商,mch_id:传入服务的商户号:sub_mch_id:传入子商户的商户号,算法签名的秘钥是服务商的秘钥. 'use stri ...
- CF1548B题解
在日报上面看到的,发现 NOIP 模拟赛考过这个 trick( 首先我们把题目要求的条件这么写: \[a_i=x_i \times m+k \] 那么我们要找到满足条件的数组,差分后的数组一定都是 \ ...
- Java GUI 实现发送邮件以及附件
实现代码: 注意点: 需要的jar包:JavaMail API 和Java Activation Framework (JAF) ,下载可参考菜鸟教程 默认使用QQ邮箱发送,需要设置授权,设置--&g ...
- Java实例变量、局部变量、静态变量
实例变量(成员变量) 成员变量定义在类中,在整个类中都可以被访问,但在方法.构造方法和语句块之外 当一个对象被实例化之后,每个实例变量的值就跟着确定 实例变量在对象创建的时候创建,在对象被销毁时销毁 ...
- docker 部署mysql tomcat时 在root@localhost~下——-——docker exec -it 容器名 /bin/bash 报错
在docker部署mysql时 报错 找不到 容器不自动启动 , docker start 容器名 也没有效果 多次尝试发现 原因是创建容器时在 下面创建的 更改为下创建 问题解决