我看到
df["col2"] = df["col1"].apply(len)
len(df["col1"])
我的问题是,
-
为什么使用";CCD_ 3";函数在1中不带括号,但在2中带括号使用?
-
两者之间有什么区别?
我经常看到这种情况,使用带括号和不带括号的函数。有人能向我解释一下到底发生了什么吗?
谢谢。
您提到的第一个示例(上面的代码(将函数len映射到目标变量df["col1"]
df["col2"] = df["col1"].apply(len)
每当我们必须将函数映射到任何可迭代的对象时,语法需要函数为且不带括号。在您的情况下,df["col1"]必须具有可以计算长度的元素。它将返回Pandas系列所有元素的遗嘱长度。以下面的例子为例。
a = ["1", "2","3","4"]
z = list( map( int, a ) ) >> [1, 2, 3, 4]
在这里,我们将内置的int函数(用于进行类型转换(映射到整个列表。
您提到的第二个例子将给出df["col1"]系列的长度。
len(df["col1"])
它不会对该系列中的元素执行任何操作。以下面的例子为例。
a = ["1", "2","3","4"]
z = len(a) >> 4
由于在这两种情况下,函数len都被提供了一个可迭代的对象,因此它没有给出任何错误。但是,正如我所解释的,输出完全不同!
在1中,函数len
被传递给一个名为apply
的方法。该方法可能会沿第一个轴应用函数len
(可能返回类似长度列表的内容(。在2中,函数len
被直接调用,参数为df["col2"]
,大概是为了获得数据帧的长度。
1中的用法有时被称为"1";"高阶函数";,但原则上,它只是将一个函数传递给另一个函数以供其使用。
在第二种情况下,您直接调用len方法,并将得到结果,即df中col1中有多少行。
在第一个例子中,您将len函数的引用提供给apply函数。这是df["col2"] = df["col1"].apply(lambda x: len(x))
的快捷方式如果您想让方法的用户交上函数来影响算法的某些部分,从而使方法的行为变得灵活,则可以使用此版本。就像这里的apply方法一样。根据列中的锥角,你想用一些东西填充新列,这里决定用其他列的内容长度来填充。
len(s(将返回s变量的长度
len将返回函数itslelf。所以如果我做a=len,那么我就可以做a(s(。当然,不建议做a=len这样的事情。
让我们看看DataFrame.apply
的文档:它的第一个参数是CCD_ 11,这是一个我们将应用于CCD_。在您的情况下,此函数为len()
。
现在,让我们看看当您将len
作为带括号的参数传递时会发生什么:
df.apply(len())
-----------------------------------------------------------------------------------
TypeError Traceback (most recent call last)
/tmp/ipykernel_11920/3211016940.py in <module>
----> 1 df.apply(len())
TypeError: len() takes exactly one argument (0 given)
而当我们使用CCD_ 15时,这是非常有效的。
这是因为您的参数必须是function
,Python用于区分函数和的方法是,函数调用的返回值在第二种情况下使用括号。