October 16, 2021

Снимаем цифровую маску с Python

Как быстро убедиться в том, что в искомой колонке датафрейма находится числовое значение? В этой статье рассмотрим несколько приемов разделения мусора от цифровой информации.

Сначала сформируем синтетический набор:

import pandas as pd
ser1 = pd.Series(['3', '5', '?'])
ser2 = pd.Series(['-1.3', '?', '-5', 'some_str'])

Объекты ser1 и ser2 отличаются тем, что в первом случае такое разделение осуществить проще, так как необходимые нам значения являются положительными и целочисленными. Для демонстрации этого достаточно использовать строчный метод isdigit, который на примере ser1 дает положительный результат, а для ser2 - нет:

ser1[ser1.map(lambda x: not x.isdigit())]
ser2[ser2.map(lambda x: not x.isdigit())]

Разберем приемы достижения нашей цели на примере ser2. Так, можно действовать по аналогии, с отличием в том, чтобы применить isdigit к очищенному значению (после удаления знаков "-" и "."):

ser2[ser2.str.replace(r'[.-]','', regex=True).map(lambda x:x.isdigit())]

Однако это вернет и строки вида "232-121":

В этой ситуации надежнее проверять на соответствие регулярному выражению:

import re
ser2[ser2.str.contains(r'^-{0,1}[\d.]+#39;)]