Лямбда-функция без передачи аргумента - PullRequest
2 голосов
/ 15 октября 2019

У меня есть пример кадра данных со столбцами 'one' и 'two', состоящими из нескольких случайных целых чисел. Я пытался понять некоторый код с лямбда-функцией более глубоко и был озадачен тем, что код, по-видимому, волшебным образом работает без предоставления аргумента для передачи лямбда-функции.

Сначала я создаю новый столбец 'newcol' с помощью метода assign () от pandas и передаю df в явную лямбда-функцию func (df). Функция возвращает журналы столбца 'one' в df:

df=df.assign(newcol=func(df))

Пока все хорошо.

Однако меня удивляет то, что код работает так же, не передавая df.

df=df.assign(newcol2=func)

Даже если я не передам (df) в лямбда-функцию, она правильно выполнит операцию. Как интерпретатор узнает, что df передается в лямбда-функцию?

Пример кода ниже и вывод:

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randint(1,10,size=16).reshape(8,2),columns=["one","two"])
func=lambda x: np.log(x.one)
df=df.assign(newcol=func(df))
print(df)

#This one works too, but why?
df=df.assign(newcol2=func)
print(df)
Output:
   one  two    newcol   newcol2
0    1    8  0.000000  0.000000
1    6    7  1.791759  1.791759
2    2    6  0.693147  0.693147
3    2    8  0.693147  0.693147
4    4    2  1.386294  1.386294
5    9    3  2.197225  2.197225
6    2    2  0.693147  0.693147
7    4    7  1.386294  1.386294

(заметьте, я мог бы использовать лямбда-функцию, встроенную в assign, но для ясности здесь она была бы явной).

Ответы [ 2 ]

1 голос
/ 15 октября 2019

Если вы используете pd.DataFrame.assign() и передаете callable, предполагается, что первым аргументом фактически является сам фрейм данных.

Например, если вы измените свой код на следующее:

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randint(1,10,size=16).reshape(8,2),columns=["one","two"])
func=lambda c, x: np.log(x.one + c)
df=df.assign(newcol=func(1, df))
print(df)

#This one will no longer work!
df=df.assign(newcol2=func)
print(df)

последний вызов assign() не будет работать.

Это объясняется в официальной документации . Линия df.assign(newcol=func(1, df)) использует путь non-callable , а линия df.assign(newcol=func) использует путь callable .

0 голосов
/ 15 октября 2019

Это не компиляция, это просто способ назначения исходного кода. Как упомянуто в документации назначения панд .

Если значение является вызываемым, оценивается по df:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...