Отображение значений из одной таблицы в другую с помощью 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)
Не пропустите ничего интересного и подписывайтесь на страницы канала в других социальных сетях: