Pandas Добавить столбец на основе значения dict другого столбца

Учитывая фрейм данных df, он содержит следующие столбцы: col1, col2, col3

Col1 содержит строковые значения (возможные повторяющиеся значения), как показано ниже:

Val1
Val2
Val3
Val1
Val1
Val1

Кроме того, у меня есть словарь, в котором хранится сопоставление Col1 -> новые значения, которые мне нужно добавить в фрейм данных «df». Пример :

{
    "Val1" : "new_val1",
    "Val2" : "new_val2",
    "Val3" : "new_val3",
}

Теперь, основываясь на отображении словаря, я хочу добавить «col_new» к «df». Пример окончательного кадра данных (показаны только соответствующие столбцы):

col1  col_new
Val1  new_val1
Val2  new_val2
Val3  new_val3
Val1  new_val1
Val1  new_val1
Val1  new_val1

Я пробовал df.map(), но, похоже, это работает только тогда, когда ключевой столбец в фрейме данных уникален.

Предложения ?

Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
2 605
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Это должно сработать, используйте map:

your_dict = {
    "Val1" : "new_val1",
    "Val2" : "new_val2",
    "Val3" : "new_val3",
}

df['col_new'] = df['col1'].map(your_dict)

какой prints ваш желаемый результат:

   col1   col_new
0  Val1  new_val1
1  Val2  new_val2
2  Val3  new_val3
3  Val1  new_val1
4  Val1  new_val1
5  Val1  new_val1

Строка df['col_new'] = df['col1'].map(your_dict) возвращает ошибку: Файл "/Library/Python/3.8/site-packages/pandas/core/series.py", строка 3983, на карте new_values ​​= super()._map_values(arg, na_action=na_action) Файл "/Library/Python/3.8/site-packages/pandas/core/base.py", строка 1160, в _map_values ​​new_values ​​= map_f(values, mapper) Файл «pandas/_libs/lib.pyx», строка 2403, в pandas._libs.lib.map_infer TypeError: объект «set» не вызывается

El Cid 12.12.2020 08:21

Странно, что это не работает, я использую эту команду почти каждый день. На моем работает идеально. Какая у вас версия pandas и python?

sophocles 12.12.2020 11:35

Это была проблема с моей стороны, я неправильно определил свой словарь; любой способ пометить этот вопрос как недействительный? (P.S. спасибо за помощь)

El Cid 12.12.2020 13:50

В дополнение к ответу @sophods вы также можете

df['col_new'] = df['col1'].apply(lambda x:your_dict[x])

Добавлено на основе комментария

import pandas as pd

df=pd.DataFrame({'col1':['Val1','Val2','Val3','Val1','Val1','Val1']})
your_dict = {
    "Val1" : "new_val1",
    "Val2" : "new_val2",
    "Val3" : "new_val3",
    }

df['col_new'] = df['col1'].apply(lambda x:your_dict[x])
print(df)

выход

   col1   col_new
0  Val1  new_val1
1  Val2  new_val2
2  Val3  new_val3
3  Val1  new_val1
4  Val1  new_val1
5  Val1  new_val1

df['col_new'] = df['col1'].apply(lambda x:your_dict[x]) возвращает ошибку: Файл "/Library/Python/3.8/site-packages/pandas/core/series.py", строка 4213, в apply mapped = lib.map_infer(values, f, convert=convert_dtype) Файл "pandas/_libs/lib.pyx", строка 2403, в файле pandas._libs.lib.map_infer "cn.py", строка 73 , в <lambda> df['col_new'] = df['col1'].apply(lambda x:your_dict[x]) TypeError: объект 'set' не подлежит подписке

El Cid 12.12.2020 08:23

Я добавил полный код, в котором я получаю результат - добро пожаловать.

Nour-Allah Hussein 12.12.2020 19:15

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