强大的匿名函数lambda使用方法,结合map、apply等使用方法

一、lambda自身的基本用法

1、语法

2、特性

3、例子

二、lambda结合内置函数(map,filter)等用法

(1) python内置的map()

(2)python内置的filter()

三、numpy中的lambda用法

(1)map()方法

(2)numpy.apply_along_axis方法

四、pandas中的lambda用法

(1)结合map:

(2) 结合 apply:

(3) 结合 applymap()

lambda有自身用法,更多的是结合内置函数的用法,本文是介绍两种函数的相结合使用的方法,更重要的是内置函数自身的对输入函数的要求做为lambda的要求。

一、lambda自身的基本用法

在Python中,lambda的语法形式如下:

lambda argument_list: expression

lambda是Python预留的关键字,argument_list和expression由用户自定义。

(1)argument_list是参数列表,它的结构与Python中函数(function)的参数列表是一样的。比如:

x
a, b
a=1, b=2
*args      # 输入是任意个数的参数,(隐性要求输入参数必须能进行算术运算)
**kwargs   # 输入是任意键值对参数
a, b=1, *args
......

(2)expression是一个关于参数的表达式。表达式中出现的参数需要在argument_list中有定义,并且表达式只能是单行的。比如:

1
None
a + b
sum(a)  : sum()要求()里的变量可迭代,这是sum函数本身所决定的,如可以为数值列表
1 if x== else 0

......

(1) lambda函数是匿名的:所谓匿名函数,就是没有名字的函数。

(2) lambda函数有输入和输出:输入是传入到参数列表argument_list的值,输出是根据表达式expression计算得到的值。

(3) lambda函数一般功能简单:单行expression决定了lambda函数不可能完成复杂的逻辑,只能完成非常简单的功能。


in:lambda x : 5
out&#xFF1A;<function __main__.<lambda>(x)>
&#x53EF;&#x4EE5;&#x53D1;&#x73B0;&#x8FD9;&#x662F;&#x4E00;&#x4E2A;&#x51FD;&#x6570;&#xFF0C;&#x600E;&#x4E48;&#x5355;&#x72EC;&#x4F7F;&#x7528;&#x5462;&#xFF1F;&#x6211;&#x60F3;&#xFF0C;&#x53EF;&#x4EE5;&#x5C06;&#x6B64;&#x8D4B;&#x503C;&#x7ED9;&#x4E00;&#x4E2A;&#x5BF9;&#x8C61;&#xFF0C;&#x4E07;&#x7269;&#x7686;&#x5BF9;&#x8C61;

&#x8FDB;&#x4E00;&#x6B65;&#x6F14;&#x793A;
y = lambda x : 5
y(4)
out:5
&#x6B64;&#x5904;&#x53EA;&#x51FA;&#x8F93;&#x51FA;&#x4E86;&#x7ED3;&#x679C;&#xFF0C;&#x4F46;&#x5E76;&#x672A;&#x7ED9;&#x4EFB;&#x4F55;&#x53D8;&#x91CF;

y = lambda x : x+5
y(4)
out:9

&#x5C06;&#x53D8;&#x91CF;&#x8D4B;&#x503C;&#xFF0C;&#x53EA;&#x662F;&#x6F14;&#x793A;&#x5B83;&#x672C;&#x8EAB;&#x7684;&#x65B9;&#x6CD5;&#x548C;&#x8FC7;&#x7A0B;&#xFF0C;&#x8FD9;&#x4E48;&#x7B80;&#x5355;&#x64CD;&#x4F5C;&#x5728;&#x73B0;&#x5B9E;&#x4E2D;&#x5E76;&#x4E0D;&#x8FD9;&#x4E48;&#x7528;
y = lambda a,b : a*b
c = y(5,6)
c
out:30
</function>

(2)结合内置函数使用,例如sum,当然,sum也可换成任何函数,包括自定义的函数,但注意要满足函数本身的参数的要求

y = lambda x : sum(x)
a = [1,2,3,4,5]
c = y(a)
c
out:15

(3)使用 args*

y = lambda *args: sum(args)
y(3,2,1)
out:6
&#x6CE8;&#x610F;&#x6B64;&#x5904;&#x4E0E;&#x4E0A;&#x4E00;&#x4E2A;&#x7528;&#x6CD5;&#x7684;&#x533A;&#x522B;

(4)结合if else使用。

注意if 和else 可能要成对出现,试过很多次,只有if 没有else一直报错

y = lambda x : 1  if x > 5  else 0
y(6)
out:1
y(2)
out:0

二、lambda结合内置函数(map,filter)等用法

主要是根据内置函数的要求放置lambad函数的位置,数据要满足函数要求。

如map()函数的格式是:

map(function,iterable,...) 第一个参数接受一个函数名,后面的参数接受一个或多个可迭代的序列,返回的是一个 集合

那么lambda就要放在map函数的function处,map后面参数就要放可迭代的对象

a = ['1','2', 3, 4]
b = list(map(lambda x : float(x)  if type(x) == str else None, a)) # &#x672C;&#x51FD;&#x6570;&#x610F;&#x601D;&#x662F;&#xFF0C;&#x82E5;&#x5BF9;&#x8C61;&#x662F;&#x5B57;&#x7B26;&#x4E32;&#xFF0C;&#x8F6C;&#x6362;&#x4E3A;&#x6570;&#x503C;&#x578B;
b
out:[1.0, 2.0, 3, 4]

函数能够从可迭代对象(如字典、列表)中筛选某些元素,并生成一个新的迭代器。可迭代对象是一个可以被”遍历”的Python对象,也就是说,它将按顺序返回各元素,这样我们就可以在for循环中使用它。

filter()函数格式是:

filter(function, iterable)

返回一个可迭代的filter对象,可以使用list()函数将其转化为列表,这个列表包含过滤器对象中返回的所有的项。

a = [1, 2, 3, 6, 7]
y = filter(lambda x : x % 2 == 0, a)
list(y)    # &#x9700;&#x8981;&#x7528;list&#x53D6;&#x51FA;&#x503C;
out:[2, 6]

names = ['Sum', 'And', 'One', 'Two', 'Fore']
list(filter(lambda x: x[0] in 'SaT', names))    # x[0]&#x76F8;&#x5F53;&#x4E8E;&#x5BF9;&#x5217;&#x8868;&#x4E2D;&#x7684;&#x6BCF;&#x4E2A;&#x5143;&#x7D20;&#x7684;&#x5B57;&#x7B26;&#x4E32;&#x5207;&#x7247;
out:['Sum', 'Two']

三、numpy中的lambda用法

需要结合map()方法或np.apply_along_axis(),它只能对一行或一列操作,不能对整个多维数组操作,相当只能于对一维数组操作

比较容易理解。

import numpy as np
arr = np.arange(15).reshape(3,5)
arr
out:
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])

arr[0]
out: array([0, 1, 2, 3, 4])

&#x5C06;&#x6570;&#x7EC4;&#x4E2D;&#x7684;arr[0]&#x8FD9;&#x4E00;&#x884C;&#x4E2D;&#x7684;&#x5143;&#x7D20;&#xFF0C;&#x8FDB;&#x884C;&#x64CD;&#x4F5C;&#xFF0C;&#x80FD;&#x88AB;2&#x6574;&#x9664;&#x8FD4;&#x56DE;
y = list(map(lambda x : 'BB' if x % 2 == 0 else 'AA' , arr[0]))
y
out:['BB', 'AA', 'BB', 'AA', 'BB']

&#x6BD4;&#x8F83;&#x4E00;&#x4E0B;,x[0]&#xFF0C;&#x5BF9;&#x5217;&#x64CD;&#x4F5C;&#x4E86;
y = list(map(0lambda x : 'BB' if x[0] %2==0 else 'AA' , arr))
y
out: ['AA', 'BB', 'AA']

格式:

numpy.apply_along_axis(function, axis, arr, *args, **kwargs)

作用: 将arr数组的每一个元素经过func函数变换形成的一个新数组。

参数介绍: 其中function,axis,arr是必选的。 function: 是一个函数; axis:表示函数function对arr是作用于行还是列; arr:为进行操作的数组; 可选参数:args, *kwargs。都是function函数额外的参数。

遗留问题:numpy暂未找到对所有元素操作的方法,但可以在自定义函数中用索引方法定义对多维数组在每一行上进行多列的操作。

&#x501F;&#x7528;&#x4EE5;&#x4E0A;&#x6570;&#x636E;arr
&#x793A;&#x4F8B;1&#xFF1A;
def f(x):
    if x[0] % 2 == 0 :
        return  'A'
    else :
        return  'B'

y = np.apply_along_axis(f, 0, arr)
y
out:array(['A', 'B', 'A', 'B', 'A'], dtype='<u1') 0 2="=" # 改用lambda y="np.apply_along_axis(lambda" x : 'a' if x[0] % else 'b', 0, arr) out:array(['a', 'a', 'a'], dtype="<U1" ) 示例2: def f(x): return (x[0]+x[1]) np.apply_along_axis(f, 1, out: array([ 11, 21]) x: + x[1], < code></u1')>

四、pandas中的lambda用法

与numpy类似,可以与map()、apply()、applymap()等方法结合使用。

格式: Series.map(*arg*,&#xA0;*na_action=None*)

map只能用于Series。

map是element-wise的,对Series中的每个数据调用一次函数; map主要是作用将函数作用于一个Series的每一个元素。

import numpy as np
import pandas as pd
arr = np.arange(15).reshape(3,5)
a = pd.DataFrame(arr,columns=['A','B','C','D','E'])
a
out:
        A   B   C   D   E
        0   0   1   2   3   4
        1   5   6   7   8   9
        2   10  11  12  13  14

a['A'].map(lambda x :  "A" if x % 2 ==0 else "B")
out:
        0    A
        1    B
        2    A
        Name: A, dtype: object

a['A'].apply(lambda x :  "A" if x % 2 ==0 else "B")
out:
        0    A
        1    B
        2    A
        Name: A, dtype: object

格式:

Series.apply(*func*,&#xA0;*convert_dtype=True*,&#xA0;*args=()*,&#xA0;***kwargs*)

DataFrame.apply(*func*,&#xA0;*axis=0*,&#xA0;*raw=False*,&#xA0;*result_type=None*,&#xA0;*args=()*,&#xA0;***kwargs*)

不仅可以用于Series,还可以用于DataFrame;

用于Series时,如果 func 返回一个 Series 对象,则结果将是一个 DataFrame。

用于DataFrame时,根据轴参数是列或者行,返回沿 DataFrame 的给定轴应用的结果。

map、apply在用于Series时,对每一个值进行处理,结果一致,两者区别可能是输入参数的要求的区别。

一般情况下,在pandas中apply应用更灵活,更广泛,尤其是自定义函数带多个参数时,建议使用apply。

a.apply(lambda x :  x.max(), axis=0)
out:
        A    10
        B    11
        C    12
        D    13
        E    14
        dtype: int64

a.apply(lambda x :  x.max(), axis=1)
out:
        0     4
        1     9
        2    14
        dtype: int64

a.apply(lambda x : x['A'] + x['B'],axis=1)
out:
        0     1
        1    11
        2    21
        dtype: int32

a.apply(lambda x : 'A'+ x.astype(str))
out:
            A     B   C   D   E
        0   A0  A1  A2  A3  A4
        1   A5  A6  A7  A8  A9
        2   A10 A11 A12 A13 A14

格式: DataFrame.applymap(*func*,&#xA0;*na_action=None*,&#xA0;***kwargs*)

对DataFrame的 每一个数据进行操作时用applymap(),返回结果是DataFrame格式

a.applymap(np.square)
out:
            A   B   C   D   E
        0   0   1   4   9   16
        1   25  36  49  64  81
        2   100 121 144 169 196

&#x80FD;&#x88AB;2&#x6574;&#x9664;&#x7684;&#x8FD4;&#x56DE;AA&#xFF0C;&#x5426;&#x5219;&#x8FD4;&#x56DE;BB
a.applymap(lambda x : "AA" if x % 2 == 0 else "BB")
out:
            A     B   C   D   E
        0   AA  BB  AA  BB  AA
        1   BB  AA  BB  AA  BB
        2   AA  BB  AA  BB  AA

&#x5C06;&#x6BCF;&#x4E2A;&#x5143;&#x7D20;&#x8F6C;&#x6362;&#x6210;&#x5B57;&#x7B26;&#x4E32;&#xFF0C;&#x5E76;&#x53D6;&#x51FA;&#x957F;&#x5EA6;
a.applymap(lambda x: len(str(x)))
out:
            A   B   C   D   E
        0   1   1   1   1   1
        1   1   1   1   1   1
        2   2   2   2   2   2

applymap&#x56E0;&#x662F;&#x5BF9;&#x6BCF;&#x4E2A;&#x5143;&#x7D20;&#x64CD;&#x4F5C;&#xFF0C;&#x4E0D;&#x80FD;&#x4F7F;&#x7528;astype&#x66F4;&#x6539;&#x6570;&#x636E;&#x7C7B;&#x578B;&#xFF0C;&#x4F46;&#x53EF;&#x7528;python&#x65B9;&#x6CD5;&#x3002;
&#x4E0B;&#x8FF0;&#x65B9;&#x6CD5;&#x4E0E;a.apply(lambda x : 'A'+ x.astype(str))&#x7ED3;&#x679C;&#x4E00;&#x81F4;
a.applymap(lambda x : 'A'+ str(x))
out:
            A     B   C   D   E
        0   A0  A1  A2  A3  A4
        1   A5  A6  A7  A8  A9
        2   A10 A11 A12 A13 A14

Original: https://blog.csdn.net/weixin_69334636/article/details/126352125
Author: weixin_668
Title: 强大的匿名函数lambda使用方法,结合map、apply等使用方法

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/761808/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球