You could use str.findall to find digits in your time columns and then with str.join and str.split you could get your result:
In [240]: df.time.str.findall('\d').str.join('_').str.split('_', expand=True)
Out[240]:
0 1
0 1 2
1 4 1
2 3 1
df[['years', 'months']] = df.time.str.findall('\d').str.join('_').str.split('_', expand=True)
In [245]: df
Out[245]:
name time years months
0 a 1 year 2 months 1 2
1 b 4 years 1 month 4 1
2 c 3 years 1 month 3 1
It's a bit faster then @Alexander's solution, and I think more general. From timing:
In [6]: %timeit df.time.str.split(expand=True).iloc[:, [0, 2]]
1000 loops, best of 3: 1.6 ms per loop
In [8]: %timeit df.time.str.findall('\d').str.join('_').str.split('_', expand=True)
1000 loops, best of 3: 1.43 ms per loop