Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >[948]Pandas数据分组的函数应用(df.apply()、df.agg()和df.transform()、df.applymap())

[948]Pandas数据分组的函数应用(df.apply()、df.agg()和df.transform()、df.applymap())

作者头像
周小董
发布于 2021-03-04 03:52:27
发布于 2021-03-04 03:52:27
2.3K00
代码可运行
举报
文章被收录于专栏:python前行者python前行者
运行总次数:0
代码可运行

文章目录

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

apply():逐行或逐列应用该函数 agg()和transform():聚合和转换 applymap():逐元素应用函数

apply()函数

介绍

apply函数是pandas里面所有函数中自由度最高的函数。该函数如下:

DataFrame.apply(func, axis=0, broadcast=False, raw=False, reduce=None, args=(), **kwds)

该函数最有用的是第一个参数,这个参数是函数,相当于C/C++的函数指针。

这个函数需要自己实现,函数的传入参数根据axis来定,比如axis = 1,就会把一行数据作为Series的数据 结构传入给自己实现的函数中,我们在函数中实现对Series不同属性之间的计算,返回一个结果,则apply函数 会自动遍历每一行DataFrame的数据,最后将所有结果组合成一个Series数据结构并返回。

样例
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import numpy as np
import pandas as pd

if __name__ == '__main__':
    f = lambda x : x.max() - x.min()
    df = pd.DataFrame(np.random.randn(4, 3), columns=list('bde'), index=['utah', 'ohio', 'texas', 'oregon']) #columns表述列标, index表述行标
    print(df)

    t1 = df.apply(f) #df.apply(function, axis=0),默认axis=0,表示将一列数据作为Series的数据结构传入给定的functionprint(t1)

    t2 = df.apply(f, axis=1)
    print(t2)

输出结果如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
b         d         e
utah    1.950737  0.318299  0.387724
ohio    1.584464 -0.082965  0.984757
texas   0.477283 -2.774454 -0.532181
oregon -0.851359 -0.654882  1.026698

b    2.802096
d    3.092753
e    1.558879
dtype: float64

utah      1.632438
ohio      1.667428
texas     3.251737
oregon    1.878057
dtype: float64
性能比较
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import numpy as np
import pandas as pd

def my_test(a, b):
    return a + b

if __name__ == '__main__':
    df = pd.DataFrame({'a':np.random.randn(6),
                       'b':['foo', 'bar'] * 3,
                       'c':np.random.randn(6)})

    print(df)

    df['value1'] = df.apply(lambda row: my_test(row['a'], row['c']), axis=1)
    print(df)

    df['vaule2'] = df['a'] + df['c']
    print(df)

输出结果如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
a    b         c
0 -1.745471  foo  0.723341
1 -0.378998  bar  0.229188
2 -1.468866  foo  0.788046
3 -1.323347  bar  0.323051
4 -1.894372  foo  2.216768
5 -0.649059  bar  0.858149

          a    b         c    value1
0 -1.745471  foo  0.723341 -1.022130
1 -0.378998  bar  0.229188 -0.149810
2 -1.468866  foo  0.788046 -0.680820
3 -1.323347  bar  0.323051 -1.000296
4 -1.894372  foo  2.216768  0.322396
5 -0.649059  bar  0.858149  0.209089

          a    b         c    value1    vaule2
0 -1.745471  foo  0.723341 -1.022130 -1.022130
1 -0.378998  bar  0.229188 -0.149810 -0.149810
2 -1.468866  foo  0.788046 -0.680820 -0.680820
3 -1.323347  bar  0.323051 -1.000296 -1.000296
4 -1.894372  foo  2.216768  0.322396  0.322396
5 -0.649059  bar  0.858149  0.209089  0.209089

注意:当数据量很大时,对于简单的逻辑处理建议方法2(个人处理几百M数据集时,方法1花时200s左右,方法2花时10s)


apply()

其中:设置axis = 1参数,可以逐行进行操作;默认axis=0,即逐列进行操作;

对于常见的描述性统计方法,可以直接使用一个字符串进行代替,例df.apply(‘mean’)等价于df.apply(np.mean);

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> 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函数。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#其中的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)对两门课逐列求平均分

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> 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)应用多个函数,可将函数放于一个列表中;

例:对两门课分别求最高分与最低分

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> 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)使用字典可以对特定列应用特定及多个函数;

例:对数学成绩求均值和最小值,对音乐课求最大值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> 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)将报错,转换是无法产生聚合结果的

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#将成绩减去各课程的平均分,使用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,返回结果中:

  • 在列索引上第一级别是原始列名
  • 在第二级别上是转换的函数名
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> 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的实例方法

例:对成绩保留小数后两位

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> 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,但标量会被广播。

来源:https://www.cnblogs.com/Cheryol/p/13451562.html https://www.cnblogs.com/mliu222/p/12003794.html

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/02/28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Pandas的apply, map, transform介绍和性能测试
来源:Deephub Imba本文约8500字,建议阅读10分钟本文介绍了如何使用 scikit-learn中的网格搜索功能来调整 PyTorch 深度学习模型的超参数。 apply函数是我们经常用到的一个Pandas操作。虽然这在较小的数据集上不是问题,但在处理大量数据时,由此引起的性能问题会变得更加明显。虽然apply的灵活性使其成为一个简单的选择,但本文介绍了其他Pandas函数作为潜在的替代方案。 在这篇文章中,我们将通过一些示例讨论apply、agg、map和transform的预期用途。 我们一
数据派THU
2023/03/29
2K0
Pandas的apply, map, transform介绍和性能测试
Pandas中文官档~基础用法3
不管是为 pandas 对象应用自定义函数,还是应用其它第三方函数,都离不开以下三种方法。用哪种方法取决于操作的对象是 DataFrame 或 Series ,是行或列,还是元素。
1480
2019/11/07
1.5K0
Pandas 2.2 中文官方教程和指南(九·二)
尝试比较不同长度的 Index 或 Series 对象将引发 ValueError:
ApacheCN_飞龙
2024/05/24
1980
pandas分组聚合转换
从上述的例子中不难看出,想要实现分组操作,必须明确三个要素:分组依据分组依据、数据来源数据来源、操作及其返回结果操作及其返回结果。同时从充分性的角度来说,如果明确了这三方面,就能确定一个分组操作,从而分组代码的一般模式:
@小森
2024/03/15
1360
pandas分组聚合转换
这5个pandas调用函数的方法,让我的数据处理更加灵活自如
最近咱们的交流群很活跃,每天都有不少朋友提出技术问题引来大家的热烈讨论探究。才哥也参与其中,然后发现很多pandas相关的数据处理问题都可以通过调用函数的方法来快速处理。
可以叫我才哥
2021/10/26
1.2K0
这5个pandas调用函数的方法,让我的数据处理更加灵活自如
Pandas的函数应用、层级索引、统计计算1.Pandas的函数应用apply 和 applymap排序处理缺失数据2.层级索引(hierarchical indexing)MultiIndex索引对
文章来源:Python数据分析 1.Pandas的函数应用 apply 和 applymap 1. 可直接使用NumPy的函数 示例代码: # Numpy ufunc 函数 df = pd.DataFrame(np.random.randn(5,4) - 1) print(df) print(np.abs(df)) 运行结果: 0 1 2 3 0 -0.062413 0.844813 -1.853721 -1.980717 1
Python攻城狮
2018/08/23
2.3K0
Pandas的函数应用、层级索引、统计计算1.Pandas的函数应用apply 和 applymap排序处理缺失数据2.层级索引(hierarchical indexing)MultiIndex索引对
Pandas-7. 自定义/第三方库函数应用
通过将函数和适量参数作为pipe()的参数来执行自定义操作,对整个DataFrame有效。 例如,一下代码将DataFrame所有元素加2:
悠扬前奏
2019/05/28
7160
长文:一文掌握Pandas
Pandas是Python数据科学生态中重要的基础成员,功能强大,用法灵活,简单记录之。
用户2183996
2019/03/01
8580
3个Pandas高频使用函数
本文主要是给大家介绍3个Pandas日常高频使用函数:apply + agg + transform。
lyhue1991
2023/02/23
6080
3个Pandas高频使用函数
Pandas的函数应用处理缺失数据
Pandas的函数应用 apply 和 applymap 1. 可直接使用NumPy的函数 示例代码: # Numpy ufunc 函数 df = pd.DataFrame(np.random.randn(5,4) - 1) print(df) print(np.abs(df)) 运行结果: 0 1 2 3 0 -0.062413 0.844813 -1.853721 -1.980717 1 -0.539628 -1.975173
王小婷
2018/06/04
9790
Pandas50个高级操作,必读!
来源:机器学习杂货店 本文约4000字,建议阅读10分钟 在Pandas对数据的复杂查询、数据类型转换、数据排序、数据的修改、数据迭代以及函数的使用。 在数据分析和数据建模的过程中需要对数据进行清洗和整理等工作,有时需要对数据增删字段。下面为大家介绍Pandas对数据的复杂查询、数据类型转换、数据排序、数据的修改、数据迭代以及函数的使用。 https://zhuanlan.zhihu.com/p/568250201 01、复杂查询 实际业务需求往往需要按照一定的条件甚至复杂的组合条件来查询数据,接下来为
数据派THU
2023/04/18
1.5K0
Pandas50个高级操作,必读!
【数据处理包Pandas】分组及相关操作
数据集team.xlsx下载地址: 链接:https://pan.quark.cn/s/9e3b2a933510 提取码:7i2y
Francek Chen
2025/01/22
1990
【数据处理包Pandas】分组及相关操作
Pandas 2.2 中文官方教程和指南(九·一)
在这里,我们讨论了与 pandas 数据结构共同的许多基本功能。首先,让我们创建一些示例对象,就像我们在 10 分钟入门 pandas 部分中所做的那样:
ApacheCN_飞龙
2024/05/24
2130
Pandas_Study02
在Pandas的各类数据Series和DataFrame里字段值为NaN的为缺失数据,不代表0而是说没有赋值数据,类似于python中的None值。数据的缺失有很多原因,缺失不是错误、无效,需要对缺失的数据进行必要的技术处理,以便后续的计算、统计。
Echo_Wish
2023/11/30
2180
pandas apply 应用套路详解
在应用时,传递给函数的对象是 Series 对象,其索引是 DataFrame 的index (axis=0) 或者 DataFrame 的 columns (axis=1)。
披头
2022/08/22
8540
pandas apply 应用套路详解
Pandas的分组聚合groupby
Pandas怎样实现groupby分组统计 groupby:先对数据分组,然后在每个分组上应用聚合函数、转换函数 import pandas as pd import numpy as np %matplotlib inline df = pd.DataFrame({'A': ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'foo'], 'B': ['one', 'one', 'two', 'three', 'two
北山啦
2022/11/27
1.7K0
Pandas的分组聚合groupby
Pandas的10个常用函数总结
Dataframe:是一种二维数据结构,它基本上是两个或多个Series的组合。它们也可以被认为是数据的电子表格,是我们最常用的数据结构。
deephub
2021/10/09
9200
用 Pandas 进行数据处理系列 二
获取行操作df.loc[3:6]获取列操作df['rowname']取两列df[['a_name','bname']] ,里面需要是一个 list 不然会报错增加一列df['new']=list([...])对某一列除以他的最大值df['a']/df['a'].max()排序某一列df.sorted_values('a',inplace=True,ascending=True) , inplace 表示排序的时候是否生成一个新的 dataFrame , ascending=True 表示升序,默认为升序,如果存在缺失的补值( Nan ),排序的时候会将其排在末尾
zucchiniy
2019/10/30
8.2K0
Python数据分析之Pandas(二)
: | ---------: | -----: | -----: | ------: | --------: | -----: | ---: | ------: | -------: | | 0 | 2018-01-01 | 3℃ | -6℃ | 晴~多云 | 东北风 | 1-2级 | 59 | 良 | 2 | | 1 | 2018-01-02 | 2℃ | -5℃ | 阴~多云 | 东北风 | 1-2级 | 49 | 优 | 1 | | 2 | 2018-01-03 | 2℃ | -5℃ | 多云 | 北风 | 1-2级 | 28 | 优 | 1 | | 3 | 2018-01-04 | 0℃ | -8℃ | 阴 | 东北风 | 1-2级 | 28 | 优 | 1 | | 4 | 2018-01-05 | 3℃ | -6℃ | 多云~晴 | 西北风 | 1-2级 | 50 | 优 | 1 |
yuanshuai
2022/08/22
1.7K0
Python数据分析之Pandas(二)
Pandas 2.2 中文官方教程和指南(二十·二)
有了 GroupBy 对象,通过分组数据进行迭代非常自然,类似于itertools.groupby()的操作:
ApacheCN_飞龙
2024/05/24
4740
Pandas 2.2 中文官方教程和指南(二十·二)
推荐阅读
相关推荐
Pandas的apply, map, transform介绍和性能测试
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验