Я бы использовал DataFrame.melt
и groupby.agg
с as_index=False
new_df = (df.assign(**df[['column2', 'column3']].astype(str))
.melt('column1',
value_vars=['column_2', 'column_3'],
value_name='column_2')
.groupby("column_1", as_index=False)[['column_2']]
.agg( "|".join))
DataFrame.assign
используется для иметь возможность динамически изменять тип столбцов на строку, выбирая только столбцы 2 и 3 .
Это может быть необходимо, если column1
не является строкой в какой-то момент