Python中的map()、apply()、applymap()的区别

map、apply、applymap的区别


1、实验背景


Pandas库被广泛用于数据处理和分析。map()、apply()和applymap()方法是Python中常用的转换方法,输出的结果及类型完全取决于作为给定方法的参数的函数

在日常数据处理过程中,会经常遇到这样的情况,对一个DataFrame进行逐行/逐列、多行/多列或逐元素的操作,很多同学可能知道需要用到map()、apply()或者applymap(),但是不知道什么情况下用哪种方法

本文将通过一个小实验来探讨Python中的map()、apply()和applymap()的区别和使用场景,并得出结论

2、实验过程


数据准备:

import numpy as np
import pandas as pd

df = pd.DataFrame({'A': [1, 4, 7], 'B': [2, 5, 8], 'C': [3, 6, 9]})
print(df)
'''
   A  B  C
0  1  2  3
1  4  5  6
2  7  8  9
'''

map()、apply()和applymap()区别演示:

1)map()

map(func, *iter):Python内置高级函数,用于对一个或多个可迭代序列的每个元素执行函数func,例如Series

# 基本使用
df['D'] = list(map(lambda a, b: a + b, df.A, df.B))
print(df)
'''
   A  B  C   D
0  1  2  3   3
1  4  5  6   9
2  7  8  9  15
'''
df['E'] = list(map(lambda a, b: [a, b], df.A, df.B))
print(df)
'''
   A  B  C   D       E
0  1  2  3   3  [1, 2]
1  4  5  6   9  [4, 5]
2  7  8  9  15  [7, 8]
'''

# 应用多个函数收集:对A、B两列应用求平均和求和函数,将结果收集到列表
df['F'] = [list(map(lambda f: f(a, b), [lambda x, y: (x+y)/2, lambda x, y: x+y])) for a, b in zip(df.A, df.B)]
print(df)
'''
   A  B  C   D       E          F
0  1  2  3   3  [1, 2]   [1.5, 3]
1  4  5  6   9  [4, 5]   [4.5, 9]
2  7  8  9  15  [7, 8]  [7.5, 15]
'''

2)apply()

apply(func, axis=0):Pandas DataFrame/Series对象的方法,对df某一列/多列或某一行/多行中的元素执行函数func,默认axis=0为列

# 对某一列的每个元素执行函数
df['D'] = df['A'].apply(lambda e: e ** 2)
# 对指定多列的每个元素执行函数
df[['E', 'F']] = df[['A', 'B']].apply(lambda e: -e)
# 对某一行的每个元素执行函数
# 除了pd.concat(),在原df基础上增量追加一行可使用如下方式(不能使用该方式添加多行)
df.loc[3] = df.loc[0].apply(lambda e: e ** 2)
# 对指定多行的每个元素执行函数
df = pd.concat([df, df.loc[0: 1, :].apply(lambda e: -e)], ignore_index=True)
print(df)
'''
   A  B  C   D  E  F
0  1  2  3   1 -1 -2
1  4  5  6  16 -4 -5
2  7  8  9  49 -7 -8
3  1  4  9   1  1  4
4 -1 -2 -3  -1  1  2
5 -4 -5 -6 -16  4  5
'''
# 对所有列分别计算sum
# df.index.values[-1]:获取最后一个索引值
df.loc[df.index.values[-1]+1] = df.apply(np.sum)
print(df)
'''
    A   B   C
0   1   2   3
1   4   5   6
2   7   8   9
3  12  15  18
'''
# 对所有行分别计算sum
df['sum'] = df.apply(np.sum, axis=1)
print(df)
'''
   A  B  C  sum
0  1  2  3    6
1  4  5  6   15
2  7  8  9   24
'''
# 对DataFrame每个元素执行函数
print(df.apply(lambda e: e + 1))
'''
   A  B   C
0  2  3   4
1  5  6   7
2  8  9  10
'''

3)applymap()

applymap(func)/df.map(func):Pandas DataFrame对象的方法,Series不支持,用于对df的每个元素执行函数func,且将来会被df.map()替换

在使用Series对象执行时报错如下:

AttributeError: 'Series' object has no attribute 'applymap'

在使用DataFrame对象执行时警告如下:

FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.
print(df.applymap(lambda e: e + 1))
print(df.map(lambda e: e + 1))
'''
   A  B   C
0  2  3   4
1  5  6   7
2  8  9  10
'''

3、实验结论


  • 1) map(func, *iter)是Python内置高级函数,可以直接调用,用于对一个或多个可迭代序列的每个元素执行函数

  • 2) apply(func, axis=0)是DataFrame/Series对象的方法,用于对df某一列(Series)/多列或某一行(Series)/多行中的每个元素执行函数

  • 3) applymap(func)仅是DataFrame对象的方法,不支持Series,不能指定轴axis,用于对df的每个元素执行函数,且将来会被df.map()替换

  • 4) 在对DataFrame或Series运用apply()、applymap()的时候,必须保证所有的字段类型与函数的参数及结果一致


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值