Pandas知识点-详解元素级批处理函数applymap和map

在Pandas中,apply()可以对DataFrame和Series按列或行批处理,applymap()和map()可以分别对DataFrame和Series进行元素级的批处理。
apply()批处理参考:​​​Pandas知识点-详解行列级批处理函数apply​​​ 与apply()相同,applymap()和map()只负责“批量”调度处理,批量执行的具体内容,由用户传入的函数决定(自定义或现成的函数)。
1.applymap用法和参数介绍
applymap(self, func, na_action=None, **kwargs) :
func: 应用于DataFrame每个元素的函数,这个函数可以是Python内置函数、Pandas或其他库中的函数、自定义函数、匿名函数。但函数必须满足一个参数、一个返回值。(returns a single value from a single value.)
na_action: 批处理时是否处理空值,支持两种设置:{None, ‘ignore’},默认为None,将空值作为np.nan传递给函数。如果将na_action设置为’ignore’,则批处理时跳过空值,不做处理。
**kwargs: 传递给函数func的关键字参数,新版本的Pandas中才支持此参数,低版本不一定支持。使用pandas==1.2.1不支持,使用pandas==1.4.1支持。
2.applymap函数使用举例

# coding=utf-8
import pandas as pd
import numpy as np


df = pd.DataFrame({'Col-1': [8, 3, 5], 'Col-2': [2, np.nan, 8], 'Col-3': [9, 8, 7], 'Col-4': [3, 6, 9]},
index=['X', 'Y', 'Z'])
print(df)
df2 = df.applymap(lambda x: x+10) # 匿名函数
print('-' * 30, '\n', df2, sep='')
Col-1  Col-2  Col-3  Col-4
X 8 2.0 9 3
Y 3 NaN 8 6
Z 5 8.0 7 9
------------------------------
Col-1 Col-2 Col-3 Col-4
X 18 12.0 19 13
Y 13 NaN 18 16
Z 15 18.0 17 19
def make_ok(s, st='ok'):
return '{}{}'.format(s, st)


df3 = df.applymap(make_ok) # 自定义函数
print('-' * 30, '\n', df3, sep='')
df4 = df.applymap(make_ok, na_action='ignore') # 不处理空值
print('-' * 30, '\n', df4, sep='')
df5 = df.applymap(make_ok, na_action='ignore', st='oooook') # 传入关键字参数
print('-' * 40, '\n', df5, sep='')
------------------------------
Col-1 Col-2 Col-3 Col-4
X 8ok 2.0ok 9ok 3ok
Y 3ok nanok 8ok 6ok
Z 5ok 8.0ok 7ok 9ok
------------------------------
Col-1 Col-2 Col-3 Col-4
X 8ok 2.0ok 9ok 3ok
Y 3ok NaN 8ok 6ok
Z 5ok 8.0ok 7ok 9ok
----------------------------------------
Col-1 Col-2 Col-3 Col-4
X 8oooook 2.0oooook 9oooook 3oooook
Y 3oooook NaN 8oooook 6oooook
Z 5oooook 8.0oooook 7oooook 9oooook

applymap()不支持给func传位置参数,所以func必须只有一个位置参数,默认接收DataFrame中的元素。
applymap()不支持设置按列还是按行,因为applymap是对DataFrame的每个元素做处理,无需指定行/列。
applymap()不支持传入多个函数进行聚合处理,也不支持函数名用字符串的方式传入。
3.不使用applymap完成等价效果

df6 = df.applymap(np.square, na_action='ignore')
print('-' * 30, '\n', df6, sep='')
df7 = df ** 2
print('-' * 30, '\n', df7, sep='')
------------------------------
Col-1 Col-2 Col-3 Col-4
X 64 4.0 81 9
Y 9 NaN 64 36
Z 25 64.0 49 81
------------------------------
Col-1 Col-2 Col-3 Col-4
X 64 4.0 81 9
Y 9 NaN 64 36
Z 25 64.0 49 81
df8 = df.applymap(lambda x: x*2)
print('-' * 30, '\n', df8, sep='')
df9 = df.add(df)
print('-' * 30, '\n', df9, sep='')
------------------------------
Col-1 Col-2 Col-3 Col-4
X 16 4.0 18 6
Y 6 NaN 16 12
Z 10 16.0 14 18
------------------------------
Col-1 Col-2 Col-3 Col-4
X 16 4.0 18 6
Y 6 NaN 16 12
Z 10 16.0 14 18

有些用applymap()进行的批处理操作,用其他方式也可以实现,如直接对DataFrame进行运算或调用其他的函数。
4.map用法和参数介绍
map(self, arg, na_action=None):
arg: 应用于Series每个元素的映射关系(不仅仅是函数),可以传入满足一个参数一个返回值的函数,也可以传入字典或另一个Series。
na_action: 同applymap。
5.map函数使用举例

s = pd.Series(range(2, 11, 2), index=[alpha for alpha in 'abcde'])
print(s)
s1 = s.map(np.sqrt) # 库函数
print('-' * 20, '\n', s1, sep='')
s2 = s.map(make_ok) # 自定义函数
print('-' * 20, '\n', s2, sep='')
s3 = s.map(lambda x: x*3) # 匿名函数
print('-' * 20, '\n', s3, sep='')
a     2
b 4
c 6
d 8
e 10
dtype: int64
--------------------
a 1.414214
b 2.000000
c 2.449490
d 2.828427
e 3.162278
dtype: float64
--------------------
a 2ok
b 4ok
c 6ok
d 8ok
e 10ok
dtype: object
--------------------
a 6
b 12
c 18
d 24
e 30
dtype: int64

map()中的函数可以传入库函数、自定义函数、匿名函数,但都需要满足一个参数一个返回值。
map()不支持给函数传入关键字参数。
6.map使用字典或另一个Series做映射

mydict = {2: 'two', 4: 'four', 6: 'six', 8: 'eight', 10: 'ten'}
s4 = s.map(mydict)
print('-' * 20, '\n', s4, sep='')
sx = pd.Series(mydict)
s5 = s.map(sx)
print('-' * 20, '\n', s5, sep='')
--------------------
a two
b four
c six
d eight
e ten
dtype: object
--------------------
a two
b four
c six
d eight
e ten
dtype: object

map()中传入一个字典时,字典的key需要与Series中的值对应,才能找到映射结果,找不到则结果为空。
map()中传入另一个Series时,传入的Series的index需要与原Series中的值对应,才能找到映射结果,找不到则结果为空。
7.applymap和map实现字符串拼接

df10 = df.applymap('oohoho{}'.format)
print('-' * 40, '\n', df10, sep='')
s6 = s.map('now data is {}'.format)
print('-' * 20, '\n', s6, sep='')
----------------------------------------
Col-1 Col-2 Col-3 Col-4
X oohoho8 oohoho2.0 oohoho9 oohoho3
Y oohoho3 oohohonan oohoho8 oohoho6
Z oohoho5 oohoho8.0 oohoho7 oohoho9
--------------------
a now data is 2
b now data is 4
c now data is 6
d now data is 8
e now data is 10
dtype: object

applymap()和map()支持直接给DataFrame或Series中的元素拼接字符串。
以上就是pandas中的applymap()和map()函数的用法介绍和分析,希望对你有帮助,如果你有其他的想法或疑问,欢迎找我一起交流讨论。

参考文档:
[1] pandas中文网:https://www.pypandas.cn/docs/