У меня есть следующие 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
Использование функции exec с применением
Однако, если я сделаю следующее:
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' не определено
Вопрос
Как я могу получить ожидаемый результат?
1 ответ
Взгляните на pandas.eval. Вы можете ссылаться на локальные переменные, используя синтаксис @var
.
Что касается выполнения произвольного кода, вы должны явно передавать локальные переменные как dict и использовать eval
для получения возвращаемого значения, например. eval("a + 2", {"a": 1})
Похожие вопросы
Новые вопросы
python
Python — это мультипарадигмальный многоцелевой язык программирования с динамической типизацией. Он предназначен для быстрого изучения, понимания и использования, а также обеспечивает чистый и унифицированный синтаксис. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Если у вас есть вопросы о версии Python, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas, NumPy) укажите это в тегах.