简单数据框定义示例:
df = pd.DataFrame({'A':[2,4,1],'B':[8,4,1],'C':[6,2,7]})
df
A B C
0 2 8 6
1 4 4 2
2 1 1 7
尝试理解以下 block 中函数参数调用的差异:
df.apply(sum)
df.apply('sum')
两者似乎都给出了相同的正确结果:
A 7
B 13
C 15
dtype: int64
我知道,对于这个简单的示例,我可以直接使用 DataFrame sum() 函数,但问题来自更复杂的代码。
最佳答案
根据文档,DataFrame apply() 函数仅接受函数作为第一个参数,但查看 pandas.core.apply 的源代码,在方法 FrameApply.get_result 中发生以下情况:
# string dispatch
if isinstance(self.f, str):
# Support for `frame.transform('method')`
# Some methods (shift, etc.) require the axis argument, others
# don't, so inspect and insert if necessary.
func = getattr(self.obj, self.f)
sig = inspect.getfullargspec(func)
if "axis" in sig.args:
self.kwds["axis"] = self.axis
return func(*self.args, **self.kwds)
这里 self.f 是 DataFrame.apply 的参数(通常是一个函数,但在你的情况下是一个字符串), self.obj 是 DataFrame 。有趣的部分是
func = getattr(self.obj, sel.f)
这意味着如果您执行 df.apply("function_name") 变量 func 将被设置为 df.function_name (这就是 getattr 的工作原理)。上述源代码的其余行与您的问题无关,只是通过填写其他关键字参数来完成 apply 的执行。
因此,在您的情况下 df.apply(sum) 将使用 Python 中的内置 sum 函数,而 df.apply("sum") 将以某种方式使用 DataFrame.sum 函数。
为什么一般可以传递字符串的一些理由可以在源代码的注释中找到,尽管我个人从未遇到过这个用例,而且我无法理解开发人员的想法。总而言之,您应该坚持遵循文档,并且只将函数传递给 DataFrame.apply,除非您真的知道自己在做什么。
关于python - Pandas 申请: difference if function name is in quotes or not,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60890498/