Согласно документации функция applyFrame 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 ("имя_функции"), переменная fun c будет установлена в df.function_name (именно так работает getattr). Остальные строки приведенного выше исходного кода не имеют отношения к вашему вопросу и просто завершают выполнение apply, заполняя дополнительные аргументы ключевого слова.
Итак, в вашем случае df.apply (sum) будет использовать встроенный -в функции sum из Python и df.apply ("sum") каким-то образом будет использоваться функция DataFrame.sum.
Некоторое обоснование того, почему вообще возможна передача строк, можно найти в комментарии в исходный код, хотя лично я никогда не сталкивался с этим вариантом использования, и я не могу читать мысли разработчиков. В общем, вам следует придерживаться документации и передавать функции только в DataFrame.apply, если вы действительно не знаете, что делаете.