Заменить слово в столбце значениями из другого столбца в фрейме данных pandas

В приведенной ниже таблице я хочу создать новый столбец или обновить столбец комментариев, который может заменить слово-заполнитель «NameTag» значением в столбце «Name» и слово «IDTag» значением в столбце «ID».

ИДЕНТИФИКАТОР Имя Комментарий А1 Алекс имя NameTag, принадлежащее IDTag, является общим именем А2 Алиса Судя по NameTag IDTag, я чувствую, что это женское имя.

Я хочу, чтобы вывод был таким...

ИДЕНТИФИКАТОР Имя Комментарий А1 Алекс имя Алекс, принадлежащее А1, является обычным именем А2 Алиса Судя по Алисе из A2, я чувствую, что это женское имя.

Я попробовал функцию замены pandas, но не получилось заменить слово именем столбца... ошибка ниже

ValueError: Series.replace не может использовать значение dict и не-None to_replace

Почему в 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
0
73
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

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

Использование .apply и лямбда:

df["Comment"] = df.apply(lambda x: x["Comment"].replace("NameTag", x["Name"]), axis=1)
import pandas as pd

data = {'ID': ['A1', 'A2'], 'Name': ['Alex', 'Alice'], 'Comment': ['the name NameTag belonging to IDTag is a common name', 'Judging the NameTag of IDTag, I feel its a girl\'s name']}

df = pd.DataFrame(data)
df['Personalized'] = df.Comment.replace(['NameTag'] * len(df), df.Name, regex=True)

print(df.Personalized)

отпечатки

0    the name Alex belonging to IDTag is a common name
1    Judging the Alex of IDTag, I feel its a girl's...

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

df["Comment"] = [c.replace("NameTag", n).replace("IDTag", i) 
                 for c, n, i in zip(df['Comment'], df['Name'], df['ID'])]
print (df)
    ID    Name                                            Comment
0  A1    Alex    the name Alex  belonging to A1  is a common name
1  A2   Alice   Judging the Alice  of A2 , I feel its a girl's...

учитывая дублированный dataFrame «тест»:

test = pd.DataFrame({
    'ID': ['A1', 'A2'], 
    'Name': ['Alex', 'Alice'], 
    'Comment': ["the name NameTag belonging to IDTag is a common name", "Judging the NameTag of IDTag, I feel its a girl's name"]})

test

выход:


ID  Name    Comment
0   A1  Alex    the name NameTag belonging to IDTag is a commo...
1   A2  Alice   Judging the NameTag of IDTag, I feel its a gir...

Этот цикл for делает то, что вам нужно, я думаю,

for row in range(test.shape[0]):
    name = test['Name'].loc[row]
    id = test['ID'].loc[row]
    test['Comment'].loc[row] = test['Comment'].loc[row].replace('NameTag', name)
    test['Comment'].loc[row] = test['Comment'].loc[row].replace('IDTag', id)

test

выход:

    ID  Name    Comment
0   A1  Alex    the name Alex belonging to A1 is a common name
1   A2  Alice   Judging the Alice of A2, I feel its a girl's name

Для общего метода, который работает с любым количеством столбцов, вы можете использовать регулярное выражение и понимание списка:

import re

cols = ['ID', 'Name']

pattern = '|'.join([f'{x}Tag' for x in cols]) # 'IDTag|NameTag'
r = re.compile(fr"\b({pattern})\b")

df['Comment'] = [r.sub(lambda m: d.get(m.group(1)), s)
                 for d, s in zip(df[cols].add_suffix('Tag').to_dict('index').values(),
                                 df['Comment'])]

Выход:

   ID   Name                                            Comment
0  A1   Alex     the name Alex belonging to A1 is a common name
1  A2  Alice  Judging the Alice of A2, I feel its a girl's name

пытаться :

import pandas as pd

df = pd.DataFrame({
     'ID':['A1','A2'],
     'Name':['Alex','Alice'],
     'Comment':["the name NameTag belonging to IDTag is a common name","Judging the NameTag of IDTag, I feel its a girl's name"]
})

for i  in range(len(df['Comment'])):
    df.loc[i,'Comment'] = df.loc[i,'Comment'].replace('IDTag',df.loc[i,'ID']).replace('NameTag',df.loc[i,'Name'])
  
    

выходной фрейм данных

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