У меня есть следующие pandas
DataFrame
, к которым мне нужно применить функцию exec
ко всем строкам.
import pandas as pd
var = 2.5
df = pd.DataFrame(["var*1", "var*3", "var*5"])
Ожидаемый результат, который мне нужен:
0
0 2.5
1 7.5
2 12.5
Однако, если я сделаю следующее:
df.apply(exec)
или даже:
df.apply(lambda x:exec(x))
Я получаю следующую ошибку:
TypeError: exec() arg 1 должен быть строкой, байтами или кодовым объектом
Другой вариант, который я пробовал, был:
>>> df[0].map(lambda x:exec(x))
0 None
1 None
2 None
Name: 0, dtype: object
Но это не тот результат, которого я ожидаю.
Я даже пытался определить функцию, а затем применить ее:
def execute(x):
exec("a = " + str(x))
return a
df[0].apply(execute)
Но результат следующая ошибка:
NameError: имя 'var' не определено
Как я могу получить ожидаемый результат?
Взгляните на pandas.eval . Вы можете ссылаться на локальные переменные, используя @var
синтаксис.
Что касается выполнения произвольного кода, вы должны явно передать локальные переменные как dict и использовать eval
для получения возвращаемого значения, например. eval("a + 2", {"a": 1})
Что касается вашего вопроса:
df[0].apply(eval, args=({}, {"var": var}))