未传递参数的Lambda函数

时间:2019-10-15 09:51:34

标签: python pandas lambda

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

最初,我将使用pandas 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)
Output:
   one  two    newcol   newcol2
0    1    8  0.000000  0.000000
1    6    7  1.791759  1.791759
2    2    6  0.693147  0.693147
3    2    8  0.693147  0.693147
4    4    2  1.386294  1.386294
5    9    3  2.197225  2.197225
6    2    2  0.693147  0.693147
7    4    7  1.386294  1.386294

(请注意,我本可以使用lambda func inline进行内联分配,但是为了清楚起见,在此处将其显式表示。)

2 个答案:

答案 0 :(得分:1)

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

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

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()的最后一次调用将无效。

这在official documentation中有解释。 第df.assign(newcol=func(1, df))行使用 non-callable 路径,而第df.assign(newcol=func)行使用 callable 路径。

答案 1 :(得分:0)

这不是编译,而是分配源代码的编写方式。如 pandas assign documentation中所述。

  

该值是可调用的,在df上评估: