本文详细介绍了Python的lambda函数。您将通过示例学习如何在现实数据场景中使用它。
目录
简介:Lambda 函数Lambda 函数的语法Lambda 和 Def 函数之间的区别地图()函数过滤器()函数减少()函数Lambda 函数:示例
lambda 参数:表达式
Lambda 函数可以有多个参数,但表达式不能超过 1 个。表达式将被计算并返回。 例子
加法 = lambda x,y:x + y 加法(2,3) 返回 5addition = lambda x,y: x + y addition(2,3) returns 5
在上面的Python代码中,x,y参数和x + y
Lambda 和 Def 函数之间的区别
通过使用 和lambda,def您可以在 python 中创建您自己的用户定义函数。
def 平方(x): 返回x**2 square(2) 返回 4def square(x): return x**2 square(2) returns 4
平方 = lambda x:x**2 square(2) 返回 4square = lambda x:x**2 square(2) returns 4
它们之间存在一些差异,如下所示。
lambda是一个返回函数对象并且不创建“名称”的关键字。而def在本地命名空间中创建名称lambda函数非常适合您想要最小化代码行的情况,因为您可以在一行 Python 代码中创建函数。不可能使用deflambda对于大多数 Python 用户来说,函数的可读性稍差。lambda函数只能使用一次,除非分配给变量名。
Lambda 函数与 filter()、map()、reduce() 等内置函数一起使用。
地图()函数
map 函数对每个元素执行函数对象(即 lambda 或 def),并返回由函数对象修改的元素列表。在下面的代码中,我们将每个元素乘以 2。
我的列表 = [1, 2, 3, 4] 映射(lambda x:x * 2,mylist)mylist = [1, 2, 3, 4] map(lambda x : x*2, mylist)
它返回地图对象。您无法直接看到返回值。要查看结果,您需要将其包装在list( )
list(map(lambda x : x*2, mylist)) 输出:[2, 4, 6, 8]list(map(lambda x : x*2, mylist)) Output : [2, 4, 6, 8]
过滤器()函数
它返回函数为 true 的项目。如果没有一个元素满足条件,则不会返回任何内容。在下面的代码中,我们检查值是否大于 2。
list(filter(lambda x : x > 2 , mylist)) 输出:[3, 4]list(filter(lambda x : x > 2 , mylist)) Output : [3, 4]
它返回过滤器对象。要查看输出值,您需要将 filter( ) 函数放入list( )
假设您有一个字典,并且您想通过特定键的值来过滤它们。
d = {'a': [1, 2, 1], 'b': [3, 4, 1], 'c': [5, 6, 2]}d = {'a': [1, 2, 1], 'b': [3, 4, 1], 'c': [5, 6, 2]}
我们过滤键“a”中等于 1 的值和键“b”中大于 1 的值。
list(filter(lambda x: x[0]==1 和 x[1]>1, zip(d['a'],d['b']))) 输出 [(1, 3)]list(filter(lambda x: x[0]==1 and x[1]>1, zip(d['a'],d['b']))) Output [(1, 3)]
这里x[0]指的是d['a'],x[1]指的是d['b']。
减少()函数
reduce函数的语法如下:
减少(函数、列表或元组)
从 functools 导入减少 减少(lambdax,y:x + y,[1,2,3,4])from functools import reduce reduce(lambda x,y: x+y, [1,2,3,4])
它返回 10。
减少功能如何工作?
- 第一步,执行 (1 + 2) 返回 3
- 第二步,第一步中的 3 将被添加到 3(这是列表的第三个值)并返回 6
- 第三步,第二步中的 6 将与 4 相加并返回 10
另一个例子:Reduce 函数
减少(lambdax,y:x * y,[1,2,3])reduce(lambda x,y: x*y, [1,2,3])
它的计算结果为 (1*2)*3,返回 6。
Lambda 函数:示例
在本节教程中,我们将看到 lambda 函数的各种实际示例。让我们创建一个 pandas 数据框以进行说明。
将 pandas 导入为 pd np.随机.种子(12) df = pd.DataFrame(np.random.randn(5, 3), index=list('abcde'), columns=list('XYZ'))import pandas as pd np.random.seed(12) df = pd.DataFrame(np.random.randn(5, 3), index=list('abcde'), columns=list('XYZ'))
XYZ 0.472986 -0.681426 0.242439 b -1.700736 0.753143 -1.534721 0.005127 -0.120228 -0.806982 d 2.871819 -0.597823 0.472457 e 1.095956 -1.215169 1.342356XYZ 0.472986 -0.681426 0.242439 b -1.700736 0.753143 -1.534721 0.005127 -0.120228 -0.806982 d 2.871819 -0.597823 0.472457 e 1.095956 -1.215169 1.342356
示例 1:向数据帧的每个值添加 2
def add2(x): 返回x+2 df.应用(add2)def add2(x): return x+2 df.apply(add2)
df.apply(lambda x: x+2)
使用apply( )函数,您可以将函数应用于 pandas 数据框。lambda 和 def 都返回相同的输出,但lambda函数可以在 apply() 函数内内联定义。
XYZ 2.472986 1.318574 2.242439 0.299264 2.753143 0.465279 2.005127 1.879772 1.193018 d 4.871819 1.402177 2.472457 e 3.095956 0.784831 3.342356XYZ 2.472986 1.318574 2.242439 0.299264 2.753143 0.465279 2.005127 1.879772 1.193018 d 4.871819 1.402177 2.472457 e 3.095956 0.784831 3.342356
示例 2:创建返回数字幂结果的函数
这里我们取 df 数据帧的所有变量的每个值的立方。
定义幂(x,n): 返回x**n df.apply(功率, n=3)def power(x,n): return x**n df.apply(power, n=3)
df.apply(lambda x : x**3)df.apply(lambda x : x**3)
X Y Z a 1.058143e-01 -0.316414 0.014250 b -4.919381e+00 0.427201 -3.614836 c 1.347751e-07 -0.001738 -0.525523 d 2.368489e+01 -0.213657 0.105460 e 1.316375e+00 -1.794361 2.418820X Y Z a 1.058143e-01 -0.316414 0.014250 b -4.919381e+00 0.427201 -3.614836 c 1.347751e-07 -0.001738 -0.525523 d 2.368489e+01 -0.213657 0.105460 e 1.316375e+00 -1.794361 2.418820
示例 3:条件语句 (IF-ELSE)
假设您要创建一个新变量,如果现有变量的值小于 90,则该变量缺失或为空。否则复制现有变量的相同值。让我们创建一个名为 Sample 的虚拟数据框,它仅包含 1 个名为 var1 的变量。条件:如果 var1 小于 90,函数应返回 var1 缺少的 else 值。
将 numpy 导入为 np 样本 = pd.DataFrame({'var1':[10,100,40] })import numpy as np sample = pd.DataFrame({'var1':[10,100,40] })
样本['newvar1'] = sample.apply(lambda x: np.nan if x['var1'] < 90 else x['var1'], axis=1)sample['newvar1'] = sample.apply(lambda x: np.nan if x['var1'] < 90 else x['var1'], axis=1)
如何阅读上面的 lambda 函数
x: value_if_condition_true 如果逻辑条件 else value_if_condition_false
axis=1告诉 python 将函数应用到特定列的每一行。默认情况下,它是 0,表示将函数应用于行的每一列。还有另一种方法可以在不指定 axis 选项的情况下编写上述函数。它将应用于系列sample['var1']
样本['newvar1'] = 样本['var1'].apply(lambda x: np.nan if x < 90 else x)sample['newvar1'] = sample['var1'].apply(lambda x: np.nan if x < 90 else x)
也可以使用 def 编写相同的函数。请参阅下面的代码。
定义未命中(x): 如果 x["var1"] < 90: 返回 np.nan 别的: 返回 x["var1"] 样本['newvar1'] = 样本.apply(miss, axis=1)def miss(x): if x["var1"] < 90: return np.nan else: return x["var1"] sample['newvar1'] = sample.apply(miss, axis=1)
var1 newvar1 0 10 NaN 1 100 100.0 2 40 NaNvar1 newvar1 0 10 NaN 1 100 100.0 2 40 NaN
示例 4:多个或嵌套 IF-ELSE 语句
假设您要创建一个标志,其中当变量的值大于或等于 1 但小于或等于 5 时,它为 yes。否则,如果值等于 7,则为 no。否则为缺失。
mydf = pd.DataFrame({'名称': np.arange(1,10,2)}) mydf["flag"] = mydf["Names"].apply(lambda x: "yes" if x>=1 and x<=5 else "no" 如果 x==7 否则 np.nan)mydf = pd.DataFrame({'Names': np.arange(1,10,2)}) mydf["flag"] = mydf["Names"].apply(lambda x: "yes" if x>=1 and x<=5 else "no" if x==7 else np.nan)
Names flag
0 1 yes
1 3 yes
2 5 yes
3 7 no
4 9 NaN