У меня есть следующий фрейм данных:
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
Что я сделал до сих пор:
Кроме того, вы должны включить код, который вы написали в свой пост.






Я бы извлек ключ (красный/синий/…) с помощью регулярного выражения, использовал словарь словарей и 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
"""
Я бы создал столбец, используя функцию этих двух столбцов, как в этом ответе