我有一个用‘1’和‘2’列组成一些随机的ints的示例数据some。我试图更深入地理解一些具有lambda函数的代码,并对代码似乎神奇地工作而没有提供要传递给lambda函数的参数感到困惑。
最初,我正在创建一个新的列'newcol‘,其中包含熊猫assign()方法,并将df传递到一个显式lambda函数func(df)中。函数返回df 'one‘列的日志:
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内嵌的赋值,但为了清晰起见,这里可以将其显式化。)
发布于 2019-10-15 10:02:37
如果您使用pd.DataFrame.assign()并传递一个callable,那么它假设第一个参数实际上是dataframe本身。
例如,如果将代码更改为以下内容:
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)使用可调用的路径.
https://stackoverflow.com/questions/58391882
复制相似问题