bfill
ing is one option:
a.bfill(axis=1).iloc[:,0]
0 a
1 b
2 c
3 b
4 a
Name: c1, dtype: object
Another one is a simple stack, gets rid of NaNs.
a.stack().reset_index(level=1, drop=True)
0 a
1 b
2 c
3 b
4 a
dtype: object
Another interesting option you don't see everyday is using the power of NumPy. Here's a modified version of Divakar's justify utility that works with object DataFrames.
justify(a.to_numpy(), invalid_val=np.nan)[:,0]
# array(['a', 'b', 'c', 'b', 'a'], dtype=object)
# as a Series
pd.Series(justify(a.to_numpy(), invalid_val=np.nan)[:,0], index=a.index)
0 a
1 b
2 c
3 b
4 a
dtype: object