Найти строку в dataframe по условию не первого вхождения

Рейтинг: 0Ответов: 1Опубликовано: 21.04.2023

Есть dataframe, в котором один из столбцов строки содержит строку вида

от 3.6.12 до 3.6.14 (Python), от 3.7.0 до 3.7.11 (Python), от 3.8.0 до 3.8.11 (Python)

Мне нужно понять, входит ли в данное перечисление диапазонов версий нужная мне версия. На данный момент пришел к следующей реализации:

(tmp_df - - изначальный датафрейм, target_indexes - датафрейм, с помощью которого в итоге можно обратиться только к нужным строкам изначального фрейма по полученным индексам)

tmp_df= pd.DataFrame({'Версия ПО': ['от 3.6.9 до 3.7.2 (Linux), 1.7 (Linux)',
                                    'от 2.9.1 до 2.9.5 (Python), от 3.6.0 до 3.6.11 (Python), от 3.7.9 до 3.8.1 (Python)'
                                    'от 3.6.12 до 3.6.14 (Python), от 3.7.0 до 3.7.11 (Python), от 3.8.2 до 3.9.11 (Python)'
                                    ]

regex = fr'(?i)[а-яА-я ]*([^а-яА-я, ]*)[а-яА-я ]*([^а-яА-я, ]*)[а-яА-я ]*\({lib_name}\)'
lib_version = '3.5.2'
lib_name = 'Python'

target_indexes = tmp_df[tmp_df['Версия ПО'].str.contains(f'({lib_name})', regex=False)][
                    'Версия ПО'].str.extract(regex)

target_indexes = target_indexes[
    target_indexes[0].le(lib_version) & target_indexes[1].ge(lib_version)]

print(tmp_df.loc[target_indexes.index])

Проблема в том, что str.extract() вытаскивает только первое вхождение в строке по регулярке и сравнивает его с заданной версией. Как можно изменить конструкцию, чтобы найти и сравнить все вхождения в строке и запомнить её индекс?

Ответы

▲ 1

В итоге решил проблему использованием метода str.extractall(), преобразовав конструкцию tmp_df.loc[target_indexes.index] в tmp_df.loc[target_indexes.index.get_level_values(0)].drop_duplicates()

target_indexes = tmp_df[tmp_df['Версия ПО'].str.contains(f'({lib_name})', regex=False)]['Версия ПО'].str.extractall(regex)

target_indexes = target_indexes[
    target_indexes[0].le(lib_version) & target_indexes[1].ge(lib_version)]

result_set = tmp_df.loc[target_indexes.index.get_level_values(0)].drop_duplicates()