pandas применяется: разница, если имя функции в кавычках или нет - PullRequest
1 голос
/ 27 марта 2020

Пример простого определения кадра данных:

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

Попытка понять разницу в вызовах аргумента функции в следующих фрагментах:

df.apply(sum)

df.apply('sum')

Кажется, что оба дают тот же правильный результат:

A     7
B    13
C    15
dtype: int64

Я понимаю, что для этого простого примера я мог бы использовать функцию sum () DataFrame напрямую, но вопрос возник из более запутанного кода.

1 Ответ

2 голосов
/ 27 марта 2020

Согласно документации функция 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, если вы действительно не знаете, что делаете.

...