Python中的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()的时候,必须保证所有的字段类型与函数的参数及结果一致
到此这篇关于Python中的map()、apply()、applymap()的区别小结的文章就介绍到这了,更多相关Python map()、apply()、applymap()内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!