python - Pandas 申请: difference if function name is in quotes or not

标签 python pandas apply

简单数据框定义示例:

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/

相关文章:

python,用 Pandas 对降序数据框进行排序

r - parLapply 超时选项

python - 具有多个参数的 Pandas .apply() 函数

python - 通过Key检索GAME数据

python - 如何使用groupby对象获取其他列的总和?

python - 在 pandas/python 上绘制带有 Z 分数的概率密度函数

R:避免在使用应用函数时将单行数据帧转换为向量

python - 有条件地计算列的最大值和最小值

python - 查找第一个索引,其中元素之和大于元素本身

python - 将一列拆分为两列,留下空白