В настоящее время я работаю над инструментом ценообразования и улучшаю качество своего кода, чтобы он работал быстрее.
Я создал функцию, которая заменяет в строке все слова с '@' на их переменные в указанном dict:
def ComputeString(self, String, DictName):
#We replace the values preceded by @ in the string provided by the variable in the dict provided. We then evaluate the formula
#If the variable doesn't exist, we raise an error
#If there is no criteria sent, we put it as a True
if pd.isnull(String) or String == True:
return True
else:
try:
return eval(re.sub("@(\w+)",
(lambda m : str(DictName[m.group(1)]) if not(isinstance(DictName[m.group(1)], str))
else "'" + DictName[m.group(1)] + "'"),
String))
except (KeyError, NameError) as e:
print(f"Erreur ComputeString: The key'{e.args[0]}' doesn't exist for {self.DictSiteComponent}.")
raise
Эта функция работает очень хорошо.
У меня есть такой фрейм данных:

Что я хотел бы сделать, так это применить формулу ComputeString ко всему столбцу Criteria в моем df, а затем выполнить логическое индексирование, чтобы сохранить только те строки, где Criteria == True. Например, у меня есть переменная @Tariff, которая может быть T1 или T2 или T3 или T4 или TP. Я хотел бы оценить каждый раз, чтобы определить, в каком сценарии я нахожусь.
Раньше я делал цикл for и отправлял для каждой строки критерии, но не думаю, что это эффективно, поскольку я обрабатываю десятки тысяч строк и вычислений, и иногда у меня больше df, чем тот, который я предоставил, и большинство столбцов не должны рассматриваться.
Я пытался поиграть с df['Criteria'].apply(self.ComputeString(df['Criteria'], MyDict), axis = 1)
, но он не работает, у меня есть ошибка, подобная этой: ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
, и она блокируется первой, если в состоянии
Не могли бы вы вести меня? Также я читаю здесь Панды: как я могу использовать функцию apply () для одного столбца? , который .apply не должен использовать, если у вас есть дополнительная информация об этом?
Спасибо