У меня есть фрейм данных, как показано ниже:
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|
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
Просто
replace
:df['vk_dom'] = df['domains'].replace(domain_dict)