Если это строки, и если нет NaN, я бы порекомендовал вызвать str.replace
внутри списка для скорости:
df['column1'] = [
x.replace('#name#', y) for x, y in zip(df.column1, df.column2)]
df
column1 column2
0 client#1 is josh josh
1 client#2 is max max
Почему списочные выражения того стоят для строковых операций? Вы можете прочитать больше на Для петель с пандами - Когда мне все равно? .
Другой интересный вариант, который вы можете рассмотреть, это str.replace
с iter
:
it = iter(df.column2)
df['column1'] = df.column1.str.replace('#name#', lambda x: next(it))
df
column1 column2
0 client#1 is josh josh
1 client#2 is max max
Должно нормально обрабатывать NaN и смешанные типы (но будет медленнее).
Более простая опция replace
от @Vaishali, которая будет работать, если подстрока "# name #" всегда находится в конце строки.
df['column1'] = df.column1.add(df.column2).str.replace('#name#', '')
df
column1 column2
0 client#1 is josh josh
1 client#2 is max max