February 1, 2021

Обработка строковых полей в Pandas

Задача  обработки строковых полей в объектах Pandas решается с помощью  векторизованных строковых операций и методом доступа к отдельным  элементам таблицы (см. статью).

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

Чистка посредством строковых операций

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

df_flat_age['улица']=df_flat_age['улица'].str.replace('пер\.{0,1}','')
df_flat_age['улица']=df_flat_age['улица'].str.replace('/.*','')
df_flat_age['улица']=df_flat_age['улица'].str.replace('\(.*','')
df_flat_age['улица']=df_flat_age['улица'].str.replace('пр.','')
df_flat_age['улица']=df_flat_age['улица'].str.replace('Проспект','')
df_flat_age['улица'] = df_flat_age['улица'].str.strip()
df_flat_age['дом']=df_flat_age['дом'].str.strip()
df_flat_age['cl_adr']=df_flat_age['улица']+';'+df_flat_age['дом']

Обработка строк посредством доступа к отдельным элементам

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

Сначала посредством метода dtypes выведем типы представленных в таблице столбцов:

Как можно увидеть, типом нашего столбца является object. В отличие от указанных выше векторизованных операций при поэлементной обработке значений (метод map) сначала потребуется привести тип столбца к строковому:

df_flat_age['общая площадь(кв.м.)']= df_flat_age['общая площадь(кв.м.)'].astype(str)
Затем для каждого элемента вызываем функцию очистки от шаблона (удаляет все кроме точки и цифр):

pat = re.compile(r'[^0-9\.]')

def square_clean(x,pat):
       x = x.replace(',','.')
       x = pat.sub('',x)
       return x

df_flat_age['общая площадь(кв.м.)']= df_flat_age['общая площадь(кв.м.)'].map(lambda x: square_clean(x, pat))

Удаляем пустые значения и преобразовываем к типу с плавающей точкой:
df_flat_age = df_flat_age.drop(df_flat_age.loc[df_flat_age['общая площадь(кв.м.)']==''].index)
df_flat_age.loc[df_flat_age['общая площадь(кв.м.)'].notnull(), 'общая площадь(кв.м.)'] = df_flat_age.loc[df_flat_age['общая площадь(кв.м.)'].notnull(), 'общая площадь(кв.м.)'].astype(np.float32)

Не пропустите ничего интересного и подписывайтесь на страницы канала в других социальных сетях:

Instagram

Яндекс Дзен

Telegram