Долгая работа цикла для поиска подстрок в строках

Вопрос скорости цикла для анализа текста. Есть код, который отлично работает на небольших объемах данных:

 for code_column, result_column, text_column in [('bad_code_5', 'Код_5', 'text_5'),
                                                            ('bad_code_4', 'Код_4', 'text_4'),
                                                            ('bad_code_3', 'Код_3', 'text_3'),
                                                            ('bad_code_2', 'Код_2', 'text_2')]:
                unique_groups = result_check_data[code_column].unique()
                for group in unique_groups:
                    group_sentences_df2 = result_check_data[result_check_data[code_column] == group]
                    group_keywords_df1 = check_df[
                        (check_df['code_5'] == group) | (check_df['code_4'] == group) | (check_df['code_3'] == group) | (
                                    check_df['code_2'] == group)]
    
                    for i, row in group_sentences_df2.iterrows():
                        sentence_lower = row['Адрес_clean']
                        for kw_index, keyword_row in group_keywords_df1.iterrows():
                            keywords = keyword_row['Наименование_clean']
                            keyword_set = set(keywords)
                            if all(" " + keyword.lower() + " " in sentence_lower for keyword in keyword_set):
                                result_check_data.at[i, result_column] = keyword_row['Код']
                                result_check_data.at[i, text_column] = " ".join(keywords)
number += 1
                                print(f"{keyword_row['Код']} цикл №{number}")

Как можно его максимально ускорить?
Я пытался использовать лямбду, но программа отказывается искать вообще любые значения. В какую сторону копать?

for code_column, result_column, text_column in [('bad_code_5', 'Код_5', 'text_5'),
                                                ('bad_code_4', 'Код_4', 'text_4'),
                                                ('bad_code_3', 'Код_3', 'text_3'),
                                                ('bad_code_2', 'Код_2', 'text_2')]:
    unique_groups = result_check_data[code_column].unique()
    for group in unique_groups:
        group_sentences_df2 = result_check_data[result_check_data[code_column] == group]
        group_keywords_df1 = check_df[
            (check_df['code_5'] == group) | (check_df['code_4'] == group) | (check_df['code_3'] == group) | (
                    check_df['code_2'] == group)]

        for i, row in group_sentences_df2.iterrows():
            sentence_lower = row['Адрес_clean']
            keywords = group_keywords_df1['Наименование_clean']
            keywords = keywords.dropna().astype(str).str.split().apply(set)
            mask = keywords.apply(lambda x: all(f" {word.lower()} " in sentence_lower for word in x))
            keyword_row = group_keywords_df1[mask]

            if not keyword_row.empty:
                result_check_data.at[i, result_column] = keyword_row['Код'].values[0]
                result_check_data.at[i, text_column] = " ".join(keyword_row['Наименование_clean'].values[0])
        number += 1
                print(f"{keyword_row['Код']} цикл №{number}")

Ответы (0 шт):