Вы первый способ самый эффективный, но вы можете использовать .str доступ с котом.
df['combined']=df[0].str.cat(df.loc[:, 1:], sep=':')
print(df)
Вывод:
0 1 2 combined
0 a b c a:b:c
Другие, менее эффективные способы:
df.apply(lambda x: ':'.join(x) ,axis=1)