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聚合函数与数据分组
我们最常需要的是汇总数据而不是把他们实际检索出来 确定表中行数(或满足某个条件或包含某个特定值的行数) 确定表中行组的和 找出表列(或所有行或特定列)的最大值,最小值和平均值 聚集函数是运行在行组上, ...
随机推荐
- URLEncoder和URLDecoder转码
目前看是为了解决网络传输的中文乱码问题 import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import ...
- kibana操作记录
GET _search { "query": { "match_all": {} } } GET _cat/nodes GET _cat/health GET ...
- Java开发名词解释
API 问题:API 解释:API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组 ...
- Java课程设计---添加学生
1.创建添加窗体 package com.student.view; import java.awt.EventQueue; import javax.swing.ButtonGroup; impor ...
- 什么是NFT?
我有一个年轻朋友,最近买了一个数字艺术品,9百多入手,几周后卖掉,赚了7万多,他告诉我这个东西叫NFT. 2021年twitter创始人杰克.多西将自己发布的第一条twitter通过NFT以250万美 ...
- @PostConstruct使用注意点
前景提要:在一个项目中,由于数据库中敏感词删除掉了,但是在网页进行匹配时仍然能够匹配上已删除的词. 查看项目源码发现使用了@PostConstruct注解: 此注解的作用是:@PostConstruc ...
- [ Skill ] load 函数优化,识别相对路径
https://www.cnblogs.com/yeungchie/ 在 cds.lib 文件中定义库的路径,为了规范库定义的管理,经常这样做: . |-- cds.lib ------------- ...
- php 生成唯一订单号5种方法
第一种 private function doCreateOrderNumber($time){ $i=1; $dd = date('Ymd',$time); $aa = 'OH'.$dd; $res ...
- 分析vue脚手架
执行流程: 执行npm run serve.找到了main.js文件,之后引入Vue.App等等.后来找到App组件,发现里面用到了组件School,于是执行School组件,最终汇总到App组件.通 ...
- tensorflow源码解析之framework-shape_inference
目录 什么是形状推断 InferenceContext 关系图 涉及的文件 迭代记录 1. 什么是形状推断 前面我们讲到op的时候,提到了操作的注册器OpRegistry,并且提到,其中注册的数据是一 ...