Используем векторизованные операции со строками в Pandas
Рассмотрим, какие возможности предоставляет Pandas для эффективной обработки строк.
Предположим мы работаем с объектом Series библиотеки Pandas следующего вида:
Содержит ли колонка шаблон
Чтобы подтвердить предположение о наличии в ячейках колонки некого шаблона, можно воспользоваться функцией contains:
ser.str.contains(r'[-\d]+')
Так как результатом являются булевы выражения, можно проиндексировать наш столбец по ним. Например, удостоверимся, что данный шаблон встречается во всех строках:
ser[~ser.str.contains(r'[-\d]+')]
Извлечение шаблона
Для этого можно воспользоваться функцией extract либо findall. Основное отличие в том, что последняя возвращает список всех вхождений:
ser.str.extract(r'-([-\d]+)', expand=False)
Полезно после извлечения удостовериться, что ничего не потеряно:
id1 = ser.str.extract(r'-([-\d]+)', expand=False) ser[(id1.isnull())&(ser.notnull())]
Аналогичные действия с помощью findall:
ser.str.findall(r'-([-\d]+)')
А так с помощью findall можно вернуть последовательности из 4 цифр по отдельности:
ser.str.findall(r'\d+')
Подсчитываем количество вхождений шаблона
С помощью метода count, проверим, все ли комбинации содержат в точности по три последовательности из четырех цифр (для удобства будем работать со столбцом id1, полученным выше):
id1.str.count(r'\d+')
Облегчить оценку поможет метод value_counts, подсчитывающий количество вхождений каждого значения:
id1.str.count(r'\d+').value_counts()
Как видим, имеются значения с последовательностями не только длины три, но и два, четыре.
Дальше изучаем значения заданной длины и пытаемся понять принцип образования id:
Допустим наш идентификатор состоит из двух первых (слева направо) неповторяющихся и ненулевых комбинаций по четыре числа. Тогда следующим шагом может стать удаление нулевых и повторяющихся значений.