Как упорядочить значения в разных столбцах в правильном порядке на основе другого фрейма данных (сопоставления) в Python Pandas

Вопрос или проблема

Я довольно новичок в Python и Pandas и испытываю трудности с объединением неупорядоченного датафрейма из Excel с картой. Я пытался найти решения в Интернете, но безуспешно.

Мой первый df_1 выглядит следующим образом:

Название продукта Val_1 Val_2 Val_3 Val_4
Prod_1 Уровень 1 Высокий Да
Prod_1 Низкий Нет Уровень 2
Prod_2 Ab Стандарт Нет
Prod_2 Bc Не стандарт
Prod_2 Не стандарт Да Bc
Prod_3 Высокий Стандарт
Prod_3 a Сложный Низкий

Как вы можете видеть, информация в столбцах Val_1 – Val_4 вставлена в случайном порядке. То, чего бы я хотел достичь, это привести все Vals в тот же порядок, что и в df_mapping, чтобы я мог объединить эти датафреймы, используя, например, pd.merge, и, возможно, создать сводную таблицу и т.д.

Таблица df_mapping выглядит следующим образом:

Продукт Val_1 Val_2 Цена
Prod_1 Уровень 1 Высокий 1
Prod_1 Уровень 1 Низкий 2
Prod_1 Уровень 2 Высокий 3
Prod_1 Уровень 2 Низкий 4
Prod_2 Ab Стандарт 1.5
Prod_2 Ab Не стандарт 2
Prod_2 Bc Стандарт 2.1
Prod_2 Bc Не стандарт 2.5
Prod_3 Высокий Стандарт 2
Prod_3 Высокий Сложный 3
Prod_3 Низкий Стандарт 4
Prod_3 Низкий Сложный 5

и df_result будет выглядеть следующим образом:

Название продукта Val_1 Val_2 Val_3 Val_4 Val_5 Цена
Prod_1 Уровень 1 Высокий 1
Prod_1 Уровень 2 Низкий 4
Prod_2 Ab Стандарт 1.5
Prod_2 Bc Не стандарт 2.5
Prod_2 Bc Не стандарт 2.5
Prod_3 Высокий Стандарт 2
Prod_3 Низкий Сложный 5

Данные Val, которые отсутствуют в карте, можно удалить из df_result. Я решил проблему, создав все возможные вариации в карте вручную, а затем объединив датафреймы, однако количество продуктов и возможных комбинаций растет. Более того, текущий df_result все еще неупорядочен.

Я был бы очень признателен за любую помощь.

Разве вы не можете просто выполнить объединение по всем столбцам df_mapping, кроме ‘цены’?

join_columns = list(test.columns)
join_columns.remove('arrival')
pd.merge(df1, df_mapping, on=join_columns, how='left')

Ответ или решение

Задача, описанная в вашем вопросе, предполагает необходимость приведения данных в нескольких столбцах к правильному порядку на основе другой таблицы-сопоставления в Python с помощью библиотеки Pandas.

Описание проблемы

У вас есть основная таблица df_1, где значения в столбцах Val_1Val_4 вставлены в случайном порядке. Вам нужно упорядочить эти данные в соответствии с таблицей df_mapping, чтобы затем иметь возможность объединить датафреймы и проводить дальнейший анализ.

Пример данных:

  • df_1: содержит информацию о продуктах и соответствующих значениях, но эти значения могут быть в неправильном порядке.
  • df_mapping: предоставляет правильный порядок и цены для комбинаций значений.

Решение

Шаг 1: Подготовка данных

Первым шагом будет загрузка библиотек и создание нужных датафреймов. Предположим, у вас уже есть pandas установлен:

import pandas as pd

# Пример создания `df_1`
data_1 = {"Product Name": ["Prod_1", "Prod_1", "Prod_2", "Prod_2", "Prod_2", "Prod_3", "Prod_3"],
          "Val_1": ["Level 1", "Low", "Ab", "Bc", "Non Standard", "High", "a"],
          "Val_2": ["High", "No", "Standard", None, "Yes", None, "Complex"],
          "Val_3": ["Yes", "Level 2", "No", "Non Standard", "Bc", "Standard", "Low"],
          "Val_4": [None, None, None, None, None, None, None]}

df_1 = pd.DataFrame(data_1)

# Пример создания `df_mapping`
data_mapping = {"Procuct": ["Prod_1", "Prod_1", "Prod_1", "Prod_1", "Prod_2", "Prod_2", "Prod_2", "Prod_2", "Prod_3", "Prod_3", "Prod_3", "Prod_3"],
                "Val_1": ["Level 1", "Level 1", "Level 2", "Level 2", "Ab", "Ab", "Bc", "Bc", "High", "High", "Low", "Low"],
                "Val_2": ["High", "Low", "High", "Low", "Standard", "Non Standard", "Standard", "Non Standard", "Standard", "Complex", "Standard", "Complex"],
                "Price": [1, 2, 3, 4, 1.5, 2, 2.1, 2.5, 2, 3, 4, 5]}

df_mapping = pd.DataFrame(data_mapping)

Шаг 2: Реализация алгоритма

  1. Очистка и преобразование данных: Мы удаляем пустые значения в df_1 и собираем уникальные комбинации пар значений.

  2. Создание объединенного идентификатора: Объединим значения, чтобы облегчить сопоставление.

  3. Сопоставление данных с df_mapping: Сопоставляем значения, используя комбинации данных и получаем упорядоченный результат с нужными данными.

Пример кода:

# Создание уникального идентификатора на основе Val_1 и Val_2, чтобы можно было объединить по ним
df_1['Combined'] = df_1[['Val_1', 'Val_2']].apply(lambda x: tuple(sorted(filter(None, x))), axis=1)
df_mapping['Combined'] = df_mapping[['Val_1', 'Val_2']].apply(lambda x: tuple(x), axis=1)

# Выполняем объединение двух таблиц на основе Product и нового поля Combined
df_result = pd.merge(df_1, df_mapping[['Procuct', 'Combined', 'Price']], 
                     left_on=['Product Name', 'Combined'], 
                     right_on=['Procuct', 'Combined'], how='left')

# Удаляем ненужные столбцы и перемещаем Price в нужное место
df_result = df_result.drop(columns=['Combined', 'Procuct'])
df_result = df_result.reindex(columns=['Product Name', 'Val_1', 'Val_2', 'Val_3', 'Val_4', 'Price'])

# Удаляем дубликаты и лишние строки
df_result = df_result.drop_duplicates(subset=['Product Name', 'Val_1', 'Val_2', 'Price'])

Шаг 3: Результат

Полученный df_result будет содержать данные в нужном порядке, готовые для дальнейшего анализа.

Таким образом, выполненные шаги позволят автоматизировать процесс сопоставления и упорядочивания данных, исключая необходимость ручного создания всех возможных комбинаций, что экономит время и снижает вероятность ошибок.

Оцените материал
Добавить комментарий

Капча загружается...