Python Pandas Dataframe - логическое индексирование с функцией по всему столбцу - PullRequest
0 голосов
/ 24 апреля 2019

В настоящее время я работаю над инструментом ценообразования и улучшаю качество своего кода, чтобы он работал быстрее.

Я создал функцию, которая заменяет в строке все слова с '@' на их переменные в указанном 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

Эта функция работает очень хорошо.

У меня есть такой фрейм данных: enter image description here

Что я хотел бы сделать, так это применить формулу 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 не должен использовать, если у вас есть дополнительная информация об этом?

Спасибо

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