Как заменить значение столбца значением из словаря на основе другого значения столбца

У меня есть следующий фрейм данных:

ID    Unique_value    
red_1        0  
red_2        1
blue_1       1                
blue_2       2           
blue_3       2             
blue_4       3         
blue_4       1          

Существует два словаря для сопоставления красных и синих идентификаторов:

red_dict = {0: "A", 1: "B", 2: "C"}
blue_dict = {0: "D", 1: "B", 2: "E", 3: "F"}

Желаемый результат:

ID    Unique_value    
red_1        A  
red_2        B
blue_1       B                
blue_2       E           
blue_3       E             
blue_4       F         
blue_4       B          

Что я сделал до сих пор:

  1. Создал два словаря.
  2. В цикле for пройдите по каждому значению в столбце ID. Если значение ID связано с красным, затем замените столбец unique_value другим значением.
  3. Я застрял в том, как заменить это одно значение из словаря значений.

Я бы создал столбец, используя функцию этих двух столбцов, как в этом ответе

Joe 26.04.2024 10:36

Кроме того, вы должны включить код, который вы написали в свой пост.

Joe 26.04.2024 10:37
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
2
58
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Я бы извлек ключ (красный/синий/…) с помощью регулярного выражения, использовал словарь словарей и groupby.apply для сопоставил значения:

mapper = {'red': {0: "A", 1: "B", 2: "C"},
          'blue': {0: "D", 1: "B", 2: "E", 3: "F"}}

df['Unique_value'] = (df.groupby(df['ID'].str.extract('([^_]+)', expand=False),
                                 group_keys=False)['Unique_value']
                        .apply(lambda g: g.map(mapper.get(g.name, {})))
                     )

Или используйте понимание списка с помощью zip:

mapper = {'red': {0: "A", 1: "B", 2: "C"},
          'blue': {0: "D", 1: "B", 2: "E", 3: "F"}}

df['Unique_value'] = [mapper.get(d, {}).get(v) for d, v in 
                      zip(df['ID'].str.extract('([^_]+)', expand=False),
                          df['Unique_value'])]

Если вы ожидаете уникальное совпадение для каждой строки, также можно создать DataFrame, стек и объединить:

mapper = {'red': {0: "A", 1: "B", 2: "C"},
          'blue': {0: "D", 1: "B", 2: "E", 3: "F"}}

df['Unique_value'] = df.merge(pd.DataFrame(mapper).stack().rename('X'),
                              left_on=['Unique_value',
                                       df['ID'].str.extract('([^_]+)', expand=False)],
                              right_index=True, how='left')['X'].values

Выход:

       ID Unique_value
0   red_1            A
1   red_2            B
2  blue_1            B
3  blue_2            E
4  blue_3            E
5  blue_4            F
6  blue_4            B

Поскольку вы все равно создаете словарь вручную, вы также можете включить цвет в ключи, например:

mapper = {
    "red_0": "A",
    "red_1": "B",
    "red_2": "C",
    "blue_0": "D",
    "blue_1": "B",
    "blue_2": "E",
    "blue_3": "F",
}

Затем вы можете заменить целую часть столбца ID значениями из столбца Unique_value. раздел может быть здесь полезен, позволяя нам делать:

df["Unique_value"] = (
    df.ID.str.partition("_")
    .drop(2, axis=1)
    .assign(Unique_value=df.Unique_value.astype(str))
    .agg("".join, axis=1)
    .map(mapper)
)

Объяснение:

df.ID.str.partition("_") создает фрейм данных, который выглядит следующим образом:

      0  1  2
0   red  _  1
1   red  _  2
2  blue  _  1
3  blue  _  2
4  blue  _  3
5  blue  _  4
6  blue  _  4
  • .drop(2, axis=1) избавляется от крайнего правого столбца,
  • .assign(...) вместо Unique_value добавляет str, так как .join потому что мы хотим
  • .map столбцы по строкам на следующем шаге, чтобы мы могли
  • mapperID.
import pandas as pd
import numpy as np

df = pd.DataFrame({'ID': ['red_1', 'red_2', 'blue_1', 'blue_2', 'blue_3', 'blue_4', 'blue_4'],
                   'Unique_value': [0, 1, 1, 2, 2, 3, 1]})
red_dict = {0: "A", 1: "B", 2: "C"}
blue_dict = {0: "D", 1: "B", 2: "E", 3: "F"}

color_dict = {"red": red_dict, "blue": blue_dict}

df["Mapped_value"] = np.where(df["ID"].str.startswith("red"),
                              df["Unique_value"].map(red_dict),
                              df["Unique_value"].map(blue_dict))


print(df)
"""
      ID     Unique_value     Mapped_value
0   red_1             0            A
1   red_2             1            B
2  blue_1             1            B
3  blue_2             2            E
4  blue_3             2            E
5  blue_4             3            F
6  blue_4             1            B
"""

Другие вопросы по теме