将自己定义的或其他库的函数应用于Pandas对象,有以下3种方法:

  1. apply():逐行或逐列应用该函数
  2. agg()和transform():聚合和转换
  3. 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()的区别:

  1. 数据聚合agg()返回的是对组内全量数据的缩减过程;
  2. 数据转换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()操作

通过以上分析我们可以看到,applyaggtransform三种方法都可以对分组数据进行函数操作,但也各有特色,总结如下:

  • apply中自定义函数对每个分组数据单独进行处理,再将结果合并;整个DataFrame的函数输出可以是标量、Series或DataFrame;每个apply语句只能传入一个函数;
  • agg可以通过字典方式指定特征进行不同的函数操作,每一特征的函数输出必须为标量;
  • transform不可以通过字典方式指定特征进行不同的函数操作,但函数运算单位也是DataFrame的每一特征,每一特征的函数输出可以是标量或者Series,但标量会被广播。

5-Pandas数据分组的函数应用(df.apply()、df.agg()和df.transform()、df.applymap())的更多相关文章

  1. pandas:数据迭代、函数应用

    1.数据迭代 1.1 迭代行 (1)df.iterrows() for index, row in df[0:5].iterrows(): #需要两个变量承接数据 print(row) print(& ...

  2. 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 ...

  3. pandas学习(数据分组与分组运算、离散化处理、数据合并)

    pandas学习(数据分组与分组运算.离散化处理.数据合并) 目录 数据分组与分组运算 离散化处理 数据合并 数据分组与分组运算 GroupBy技术:实现数据的分组,和分组运算,作用类似于数据透视表 ...

  4. python中pandas数据分析基础3(数据索引、数据分组与分组运算、数据离散化、数据合并)

    //2019.07.19/20 python中pandas数据分析基础(数据重塑与轴向转化.数据分组与分组运算.离散化处理.多数据文件合并操作) 3.1 数据重塑与轴向转换1.层次化索引使得一个轴上拥 ...

  5. pandas数据的分组与分列

    读入数据:  数据分组:我们可以看到num这列它的数字在0-20之间变化,我们可以对其增加一列,用来对其分组 df['新增一列的名称']=pd.cut(df['要分组的列'],要分组的区间,新增一列后 ...

  6. pandas数据查询(数值、列表、区间、条件、函数)

    import pandas as pd # 0 读取数据 df = pd.read_csv("文件路径")#例子是北京一年的天气情况 df.head()#查看表头 # 设定索引为日 ...

  7. 小白学 Python 数据分析(11):Pandas (十)数据分组

    人生苦短,我用 Python 前文传送门: 小白学 Python 数据分析(1):数据分析基础 小白学 Python 数据分析(2):Pandas (一)概述 小白学 Python 数据分析(3):P ...

  8. python数据分析之pandas数据选取:df[] df.loc[] df.iloc[] df.ix[] df.at[] df.iat[]

    1 引言 Pandas是作为Python数据分析著名的工具包,提供了多种数据选取的方法,方便实用.本文主要介绍Pandas的几种数据选取的方法. Pandas中,数据主要保存为Dataframe和Se ...

  9. MySQL聚合函数与数据分组

    我们最常需要的是汇总数据而不是把他们实际检索出来 确定表中行数(或满足某个条件或包含某个特定值的行数) 确定表中行组的和 找出表列(或所有行或特定列)的最大值,最小值和平均值 聚集函数是运行在行组上, ...

随机推荐

  1. 原生数据类型 nint,nuint,nfloat

    原生数据类型根据操作系统32位 64位的不同,用这个关键定义的数据大小也不一样. 比如 nint 在 Xamarin.iOS 中,是 native int(原生整数)的缩写.当设备是 Apple 发布 ...

  2. Visual Studio 文字样式背景设置

    菜单栏 "工具"->选项->环境->常规

  3. Goland sync.Map大白话解析

    Goland sync.Map大白话解析 代码解析链接:https://mp.weixin.qq.com/s/H5HDrwhxZ_4v6Vf5xXUsIg 建议对照参考链接代码食用 结构体 可以简单理 ...

  4. 昇思MindSpore全场景AI框架 1.6版本,更高的开发效率,更好地服务开发者

    摘要:本文带大家快速浏览昇思MindSpore全场景AI框架1.6版本的关键特性. 全新的昇思MindSpore全场景AI框架1.6版本已发布,此版本中昇思MindSpore全场景AI框架易用性不断改 ...

  5. 8.Flink实时项目之CEP计算访客跳出

    1.访客跳出明细介绍 首先要识别哪些是跳出行为,要把这些跳出的访客最后一个访问的页面识别出来.那么就要抓住几个特征: 该页面是用户近期访问的第一个页面,这个可以通过该页面是否有上一个页面(last_p ...

  6. 新建vue3.0 项目—步骤详细介绍

    一.环境搭建 1.安装node环境(版本≥ 8.9) 2.安装vue-cli3.0 npm install @vue/cli -g 此处省略安装步骤截图了,相信各位都已装好了,下图为查看版本结果: 二 ...

  7. oracle数据库导入导出语句

    一.导出: 导出语句: expdp sanyayun/sanyayun@syerpdb directory=DMP dumpfile=fooderp.dmp content=all SCHEMAS=s ...

  8. emu8086实现两位数加法运算

    题目说明:给出一个公式,例如 "35 + 28 = ",输出计算结果 一.准备材料 DOS功能调用表:https://blog.csdn.net/mybelief321/artic ...

  9. ybt1130:找第一个只出现一次的字符

    1130:找第一个只出现一次的字符 时间限制: 1000 ms         内存限制: 65536 KB提交数: 62333     通过数: 23786 [题目描述] 给定一个只包含小写字母的字 ...

  10. Java基础——类与接口

    一.类与接口的关系 1.类与类的关系 继承关系,只能单继承,不能多继承:但是可以多层继承 2.类与接口的关系 实现关系,可以单实现,也可以多实现,还可以继承一个类的同时实现多个接口 3.接口与接口的关 ...