April 4, 2021

Используем векторизованные операции со строками в 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:

Допустим наш идентификатор состоит из двух первых (слева направо) неповторяющихся и ненулевых комбинаций по четыре числа. Тогда следующим шагом может стать удаление нулевых и повторяющихся значений.