第二章:25+ Python 数据操作教程(第十五节PYTHON LAMBDA 函数及示例)持续更新中

70 阅读3分钟

本文详细介绍了Python的lambda函数。您将通过示例学习如何在现实数据场景中使用它。

目录

简介:Lambda 函数Lambda 函数的语法Lambda 和 Def 函数之间的区别地图()函数过滤器()函数减少()函数Lambda 函数:示例

Lambda 函数的语法

Lambda 和 Def 函数之间的区别

地图()函数

过滤器()函数

减少()函数

Lambda 函数:示例


lambda 参数:表达式

Lambda 函数可以有多个参数,但表达式不能超过 1 个。表达式将被计算并返回。 例子

加法 = lambda x,y:x + y 加法(2,3) 返回 5
addition = lambda x,y: x + y
addition(2,3) returns 5

在上面的Python代码中,x,y参数和x + y

是被求值并返回的表达式。

Lambda 和 Def 函数之间的区别

通过使用 和lambdadef您可以在 python 中创建您自己的用户定义函数。

def 平方(x):
     返回x**2
 
square(2) 返回 4
def square(x):
     return x**2
 
square(2) returns 4

平方 = lambda x:x**2

square(2) 返回 4
square = lambda x:x**2

square(2) returns 4

它们之间存在一些差异,如下所示。

  1. lambda 是一个返回函数对象并且不创建“名称”的关键字。而def 在本地命名空间中创建名称
  2. lambda 函数非常适合您想要最小化代码行的情况,因为您可以在一行 Python 代码中创建函数。不可能使用def
  3. lambda 对于大多数 Python 用户来说,函数的可读性稍差。
  4. 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. 第一步,执行 (1 + 2) 返回 3
  2. 第二步,第一步中的 3 将被添加到 3(这是列表的第三个值)并返回 6
  3. 第三步,第二步中的 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.53​​4721
0.005127 -0.120228 -0.806982
d 2.871819 -0.597823 0.472457
e 1.095956 -1.215169 1.342356
         XYZ
0.472986 -0.681426 0.242439
b -1.700736 0.753143 -1.53​​4721
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.342356
          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.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.418820
              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.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      NaN
   var1  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