У меня есть некоторые проблемы с функцией применения Pandas при использовании нескольких столбцов со следующим фреймом данных
df = DataFrame ({'a' : np.random.randn(6),
'b' : ['foo', 'bar'] * 3,
'c' : np.random.randn(6)})
и следующая функция
def my_test(a, b):
return a % b
Когда я пытаюсь применить эту функцию с:
df['Value'] = df.apply(lambda row: my_test(row[a], row[c]), axis=1)
Я получаю сообщение об ошибке:
NameError: ("global name 'a' is not defined", u'occurred at index 0')
Я не понимаю это сообщение, я правильно определил имя.
Я был бы очень признателен за любую помощь по этому вопросу
Обновить
Спасибо за вашу помощь. Я действительно допустил некоторые синтаксические ошибки с кодом, индекс должен быть поставлен ''. Однако я все еще получаю ту же проблему, используя более сложные функции, такие как:
def my_test(a):
cum_diff = 0
for ix in df.index():
cum_diff = cum_diff + (a - df['a'][ix])
return cum_diff
apply
как можно больше. Если вы не уверены, что вам нужно его использовать, скорее всего, нет. Я рекомендую взглянуть на то, когда я хочу использовать pandas apply () в своем коде? ,my_test(a)
не знает, чтоdf
есть, поскольку она не была передана в качестве аргумента (еслиdf
не предполагается, что она глобальная, что было бы ужасной практикой). Вам нужно передать все значения, которые вам понадобятся, внутри функции в качестве аргументов (желательно по порядку), иначе как функция узнает, откуда онаdf
берется? Кроме того, программирование в пространстве имен, усеянном глобальными переменными, является плохой практикой, поэтому вы не будете ловить подобные ошибки.Ответы:
Кажется, вы забыли
''
свою строку.Кстати, на мой взгляд, более элегантно выглядит следующий способ:
источник
pythonista
из-за некоторых перспектив, включая эту.Если вы просто хотите вычислить (столбец a)% (столбец b), вам это не нужно
apply
, просто сделайте это напрямую:источник
Допустим, мы хотим применить функцию add5 к столбцам 'a' и 'b' в DataFrame df.
источник
Все предложения, приведенные выше, работают, но если вы хотите, чтобы ваши вычисления были более эффективными, вы должны воспользоваться крошечными векторными операциями (как указано здесь) .
Пример 1: цикл с
pandas.apply()
:Пример 2: векторизация с использованием
pandas.apply()
:Пример 3: векторизация с использованием массивов NumPy:
Таким образом, векторизация с использованием массивов numpy увеличила скорость почти на два порядка.
источник
Это то же самое, что и в предыдущем решении, но я определил функцию в самом df.apply:
источник
Я дал сравнение всех трех, обсужденных выше.
Используя значения
139 мкс ± 1,91 мкс на цикл (среднее ± стандартное отклонение из 7 циклов, 10000 циклов в каждом)
Без ценностей
216 мкс ± 1,86 мкс на цикл (среднее ± стандартное отклонение из 7 циклов, 1000 циклов в каждом)
Применить функцию
474 мкс ± 5,07 мкс на цикл (среднее ± стандартное отклонение из 7 циклов, 1000 циклов в каждом)
источник