February 2, 2021

Отображение значений из одной таблицы в другую с помощью Pandas

При подготовке признаков для моделей машинного обучения зачастую  приходится добавлять значения из одной таблицы в другую, используя для  этого одинаковые поля для идентификации того, откуда и куда перенести  данные. Например, в ходе обработки сведений о продаже недвижимости в  Республике Северная Осетия Алания, возникла задача добавления к  характеристикам жилья дату возведения дома. Исходная таблица имеет  следующий вид:

Также в нашем распоряжении имеется другая таблица о периоде возведения домов следующего вида:

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

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

df_flat_age=df_flat_age[['год постройки','cl_adr']]
df_flat_age.loc[df_flat_age['cl_adr'].notnull(), 'cl_adr'] = df_flat_age.loc[df_flat_age['cl_adr'].notnull(), 'cl_adr'].map(lambda x: x.strip())
df_flat_age = df_flat_age.set_index(['cl_adr'])
flat_dict = df_flat_age.T.to_dict('list')

Вот как будет выглядеть итоговый словарь:

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

df['build_age'] = df['cl_adr'].map(flat_dict)

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

df.loc[df['build_age'].notnull(), 'build_age'] = df.loc[df['build_age'].notnull(), 'build_age'].map(lambda x: x[0])
df.loc[df['build_age'].notnull(), 'build_age'] = df.loc[df['build_age'].notnull(), 'build_age'].astype(np.float32)

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

Instagram

Яндекс Дзен

Telegram