Создайте новый столбец со значением, найденным в другом DataFrame. - PullRequest
0 голосов
/ 29 апреля 2018

У меня есть два кадра данных:

  • df_components: список уникальных компонентов (ID, ОПИСАНИЕ)
  • dataset: несколько строк и столбцов из CSV (один из этих столбцов содержит описание компонента).

Мне нужно создать новый столбец в dataset с идентификатором компонента в соответствии с df_components.

Я пытался сделать так:

Создание столбцов df_components и ID на основе индекса

components = dataset["COMPDESC"].unique()
df_components = pd.DataFrame(components, columns=['DESCRIPTION'])
df_components.sort_values(by='DESCRIPTION', ascending=True, inplace=True)
df_components.reset_index(drop=True, inplace=True)
df_components.index += 1
df_components['ID'] = df_components.index

Пример вывода:

                                           DESCRIPTION   ID
1                                             AIR BAGS    1
2                                     AIR BAGS:FRONTAL    2
3               AIR BAGS:FRONTAL:SENSOR/CONTROL MODULE    3
4                                 AIR BAGS:SIDE/WINDOW    4

Создайте COMP_ID в наборе :

def create_component_id_column(row):
    found = df_components[df_components['DESCRIPTION'] == row['COMPDESC']]
    return found.ID if len(found.index) > 0 else None

dataset['COMP_ID'] = dataset.apply(lambda row: create_component_id_column(row), axis=1)

Однако это дает мне ошибку ValueError: Wrong number of items passed 248, placement implies 1. Будучи 248 количество предметов на df_components.

Как я могу создать этот новый столбец с идентификатором из элемента, найденного в df_components?

1 Ответ

0 голосов
/ 29 апреля 2018

Ваша логика кажется слишком сложной. Поскольку в настоящее время вы создаете df_components из dataset, лучше использовать категориальных данных с dataset. Это означает, что вам не нужно создавать df_components.

Шаг 1

Преобразование dataset['COMPDESC'] в категориальное.

dataset['COMPDESC'] = dataset['COMPDESC'].astype('category')

Шаг 2

Создание идентификатора из категориальных кодов. Так как категории сортируются по алфавиту по умолчанию и индексация начинается с 0, добавьте 1 к кодам.

dataset['ID'] = dataset['COMPDESC'].cat.codes + 1

При желании вы можете извлечь полное категориальное отображение в словарь:

cat_map = dict(enumerate(dataset['COMPDESC'].cat.categories))

Помните, что всегда должно быть 1-смещение, если вы хотите, чтобы ваши идентификаторы начинались с 1. Кроме того, вам нужно будет явно обновлять «ID» каждый раз, когда изменяется «DESCRIPTION».

Преимущества использования категориальных данных

  • Эффективное использование памяти : строки сохраняются только один раз.
  • Структура : вы определяете категории и имеете автоматический уровень проверки данных.
  • Согласованный : поскольку сопоставления категорий с кодами всегда 1: 1, они всегда будут согласованными, даже при добавлении новых категорий.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...