for the sake of completeness:
In [160]: df1.add([' '] * (df1.columns.size - 1) + ['']).sum(axis=1)
Out[160]:
0 New york Atlanta Mumbai
1 Beijing Paris Budapest
2 Brussels Oslo Singapore
dtype: object
Explanation:
In [162]: [' '] * (df.columns.size - 1) + ['']
Out[162]: [' ', ' ', '']
Timing against 300K rows DF:
In [68]: df = pd.concat([df] * 10**5, ignore_index=True)
In [69]: df.shape
Out[69]: (300000, 3)
In [76]: %timeit df.apply(" ".join, axis=1)
1 loop, best of 3: 5.8 s per loop
In [77]: %timeit df[0].str.cat(df.ix[:, 1:].T.values, sep=' ')
10 loops, best of 3: 138 ms per loop
In [79]: %timeit pir(df)
1 loop, best of 3: 499 ms per loop
In [80]: %timeit pir2(df)
10 loops, best of 3: 174 ms per loop
In [81]: %timeit pir3(df)
10 loops, best of 3: 115 ms per loop
In [159]: %timeit df.add([' '] * (df.columns.size - 1) + ['']).sum(axis=1)
1 loop, best of 3: 478 ms per loop
Conclusion: current winner is @piRSquared's pir3()