Python 不带传递参数的Lambda函数

Python 不带传递参数的Lambda函数,python,pandas,lambda,Python,Pandas,Lambda,我有一个示例数据帧,其中列“one”和“two”由一些随机整数组成。我试图更深入地理解一些带有lambda函数的代码,但感到困惑的是,这些代码似乎在没有提供要传递给lambda函数的参数的情况下神奇地工作 最初,我使用assign()方法创建一个新列“newcol”,并将df传递给一个显式lambda函数func(df)。函数返回df的“一”列的日志: df=df.assign(newcol=func(df)) 到目前为止还不错 然而,让我困惑的是,代码在不通过df的情况下也能正常工作 df=

我有一个示例数据帧,其中列“one”和“two”由一些随机整数组成。我试图更深入地理解一些带有lambda函数的代码,但感到困惑的是,这些代码似乎在没有提供要传递给lambda函数的参数的情况下神奇地工作

最初,我使用assign()方法创建一个新列“newcol”,并将df传递给一个显式lambda函数func(df)。函数返回df的“一”列的日志:

df=df.assign(newcol=func(df))
到目前为止还不错

然而,让我困惑的是,代码在不通过df的情况下也能正常工作

df=df.assign(newcol2=func)
即使我没有将(df)传递给lambda函数,它也会正确地执行操作。解释器如何知道df被传递到lambda函数中

下面的示例代码和输出:

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randint(1,10,size=16).reshape(8,2),columns=["one","two"])
func=lambda x: np.log(x.one)
df=df.assign(newcol=func(df))
print(df)

#This one works too, but why?
df=df.assign(newcol2=func)
print(df)

(注意,我本可以使用assign的lambda func内联函数,但为了清晰起见,这里将其显式使用。)

如果使用
pd.DataFrame.assign()
并传递一个
可调用的
,则它假定第一个参数实际上是数据帧本身

例如,如果将代码更改为以下内容:

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randint(1,10,size=16).reshape(8,2),columns=["one","two"])
func=lambda c, x: np.log(x.one + c)
df=df.assign(newcol=func(1, df))
print(df)

#This one will no longer work!
df=df.assign(newcol2=func)
print(df)
最后一次调用
assign()
将不起作用

这一点在本节中进行了解释。
df.assign(newcol=func(1,df))
使用不可调用的路径,而行
df.assign(newcol=func)
使用可调用的路径。

这不是编译,只是如何编写assign源代码。如中所述

其中该值是可调用的,根据df计算:


我对df知之甚少,但下面的代码:
df.assign(newcol=func(df))
表示您已经用param
df
调用了
func
。然而,这:
df.assign(newcol2=func)
意味着您正在传入
func
,而不调用它,因此df可以在需要时调用它。正如@quamrana所说。在文档中,它说“如果值是可调用的,那么它们将在数据帧上计算并分配给新列……如果值是不可调用的(例如,一个系列、标量或数组),那么它们将被简单地分配。”因此,在第二个示例中,它将应用函数。干杯,回答得好。今天学到了一些新东西:)作为旁注,Python代码是解释的,而不是编译的(通常)。谢谢,编辑成解释器。
import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randint(1,10,size=16).reshape(8,2),columns=["one","two"])
func=lambda c, x: np.log(x.one + c)
df=df.assign(newcol=func(1, df))
print(df)

#This one will no longer work!
df=df.assign(newcol2=func)
print(df)