我有一个示例数据框,其中的列“一”和“二”由一些随机整数组成。我试图更深入地了解带有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进行内联分配,但是为了清楚起见,在此处将其显式表示。)
答案 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上评估: