文章主要实现的是使用map对传入的序列中每个元素进行计算,使用reduce对传入的序列中第一个元素进行计算后得到计算结果、再将这个结果对下一个元素进行计算,直至结束。在使用Python数据清洗时,这两个函数可以有效减少代码冗余、提升计算效率等。
本篇文章既然讲Python数据清洗常用的map和reduce函数,那么首先说明下两个函数的不同点,以便有几个简单的印象。
参数不同
- map接收两个参数,第一个参数是函数,第二个参数是序列(列表),函数可以接收一个或多个参数。
- reduce接收两个参数,第一个参数是函数,第二个参数是序列(列表),但函数只能接收两个参数。
计算逻辑不同
map()是将传入的函数依次作用到序列的每个元素,每个元素都是独自被函数计算一次;
reduce()是将传人的函数作用在序列的第一个元素并得到结果后,把这个结果继续与下一个元素作用,直到序列结束;
下面将通过实际的案例进行说明。
map函数的应用场景
map
函数接收两个输入参数,第一个参数是函数(仅接受一个参数)、第二个参数是Iterable
,由于Iterator
是惰性序列( 惰性是指你不主动去遍历计算它,就不会计算其中元素的值),因此通过list()
函数让它把整个序列都计算出来并返回一个list。
map
函数将传入的函数依次计算到传入序列的每个元素,并把结果作为新的Iterator
返回。
map
函数在Python数据清洗时迭代计算的对象是列表(也就是说只要数据放到列表中就行,理论上列表里也可以是字典、df、series等等),主要的应用场景包括:
- 列表的数学运算
- 列表的格式转换
- 列表的字符串分割
map函数应用案例
1 | %%timeit |
上边是对list=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]中的每个元素执行了2次方的计算,代码执行时长约996纳秒。
同时,map的计算过程也可以通过for循环的方式计算,但循环的计算效率将极大地下降,如下:
1 | %%timeit |
上边同样是对list=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]中的每个元素执行了2次方的计算,代码执行时长约3.12微秒,1微妙=1000纳秒,也就是说map的计算时间比for循环的计算时间缩短了3倍,map完胜。
1 | %%timeit |
从计算过程看得出来map
作为高阶函数、它事实上把运算规则抽象了、那么也就可以在现实工作中进行复杂的逻辑计算。
reduce函数的应用内场景
reduce
函数同样是接收两个输入参数,第一个参数是函数(仅接受两个参数)、第二个参数是Iterable
,细心的朋友们可能会发现这两个函数有一个不同点,那就是第一个参数函数接受的输入参数个数不同,map
函数第一个参数是函数只能接受一个参数的输入,而reduce
函数第一个参数是函数可以接受两个参数的输入,这在不同程度解决掉了很大计算开销的问题。
reduce
函数在迭代序列的过程中,首先把列表中 前两个元素(只能两个)传给 函数,函数加工后,然后把 得到的结果和第三个元素 作为两个参数传给函数参数, 依次类推直至结束。
reduce
函数在Python数据清洗时迭代计算的对象是列表(也就是说只要数据放到列表中就行,理论上列表里也可以是字典、df、series等等),主要的应用场景包括:
- 多个数据框join
- 列表的递推计算
reduce函数应用案例-多个数据框join
1 | def function_reduce(x, y): |
reduce函数应用案例-多个数据集中的并集和交集
1 | %%timeit |
reduce函数应用案例-转换格式并累积计算
1 | %%timeit |