You can use apply+ DataFrame:
cols = ['sm','sb','mt','dv']
df[cols] = pd.DataFrame(df.apply(lambda x: foo(x[0], x[1]), 1).values.tolist(),columns= cols)
print (df)
0 1 sm sb mt dv
0 1 2 3 -1 2 0.500000
1 3 4 7 -1 12 0.750000
2 5 6 11 -1 30 0.833333
3 7 8 15 -1 56 0.875000
Solution with concat
cols = ['sm','sb','mt','dv']
df[cols] = pd.concat(foo(df[0], df[1]), axis=1, keys=cols)
print (df)
0 1 sm sb mt dv
0 1 2 3 -1 2 0.500000
1 3 4 7 -1 12 0.750000
2 5 6 11 -1 30 0.833333
3 7 8 15 -1 56 0.875000
It is also possible to create a new DataFrameand then an concatoriginal:
cols = ['sm','sb','mt','dv']
df1 = pd.concat(foo(df[0], df[1]), axis=1, keys=cols)
print (df1)
sm sb mt dv
0 3 -1 2 0.500000
1 7 -1 12 0.750000
2 11 -1 30 0.833333
3 15 -1 56 0.875000
df = pd.concat([df, df1], axis=1)
print (df)
0 1 sm sb mt dv
0 1 2 3 -1 2 0.500000
1 3 4 7 -1 12 0.750000
2 5 6 11 -1 30 0.833333
3 7 8 15 -1 56 0.875000