Искать словарь в столбце фрейма данных?

У меня есть фрейм данных, как показано ниже:

df1

|id|   domains| name|
| 1|      life|  xyz|
| 2|      life|  hyu|
| 3|vkontakete|  jik|

И словарь:

domain_dict = { "tassagency": "TACC",
                "life": "LIFE.ru",
                "ria": "RIA | Taza", 
                "nws_ru" : "NEWS.ru | Новости",
                "mash" :"Mash | Мэш"}

Я хочу получить значения из domain_dict, сопоставив ключи из словаря в столбце доменов df1 и поместив их в новый столбец в df1, если домены в df1 не соответствуют ни одному ключу в словаре, мы сохраним то же самое в df1 как видно из ожидаемого результата в 3-й записи.

Я попробовал следующий подход:

df1["vk_dom"] = np.nan

for i in df1.index:
    for i,(k, v) in enumerate(domain_dict.items()):
        if k == (df1['domains'][i]):
            df1["vk_dom"][i] = v
        else:
            df1["vk_dom"][i] = df1['domains'][i]

как я могу получить результат ниже ожидаемого:

|id|   domains| name|     vk_dom|
| 1|      life|  xyz|    LIFE.ru|
| 2|      life|  hyu|    LIFE.ru|
| 3|vkontakete|  jik| vkontakete|

Просто replace: df['vk_dom'] = df['domains'].replace(domain_dict)

mozway 10.04.2023 17:11
Почему в 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
1
82
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

import pandas as pd

domain_dict = {
    "tassagency": "TACC",
    "life": "LIFE.ru",
    "ria": "RIA | Taza",
    "nws_ru" : "NEWS.ru | Новости",
    "mash" :"Mash | Мэш"
}

df2 = pd.Series(domain_dict).reset_index()
df2.columns = ['domains', 'vk_dom']


df1 = pd.merge(df1, df2, on = ['domains'], how = 'left')

df1.vk_dom = df1.vk_dom.combine_first(df1.domains)

Вы можете создать DataFrame из domain_dict -> merge его с вашим df1, используя left join -> заполнить NaN значениями из столбца домена:

domain_dict = {
            "tassagency": "TACC",
            "life": "LIFE.ru",
            "ria": "RIA | Taza",
            "nws_ru" : "NEWS.ru | Новости",
            "mash" :"Mash | Мэш"
        }
        
domain_df = pd.DataFrame(domain_dict.items(), columns=['domains', 'vk_dom'])
result = df1.merge(domain_df, how='left', on='domains')
result.loc[result['vk_dom'].isnull(), 'vk_dom'] = result['domains']

Это даст вам следующий результат с именем DataFrame:

    id  domains name    vk_dom
0   1   life    xyz LIFE.ru
1   2   life    hyu LIFE.ru
2   3   vkontakete  jik vkontakete
Ответ принят как подходящий

Используйте df.map(), чтобы сопоставить столбец доменов со значениями в domain_dict.

df1["vk_dom"] = df1["domains"].map(domain_dict).fillna(df1["domains"])
print(df1)

   id     domains name      vk_dom
0   1        life  xyz     LIFE.ru
1   2        life  hyu     LIFE.ru
2   3  vkontakete  jik  vkontakete

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