Trying to write a small example:
import pandas as pd
df = pd.DataFrame({"Description":["A", "B"], "Title":["Hello1", "Hello2"]})
def myfunc(x,y): return x+y, y+x
df['col2'] = df.apply(lambda x: myfunc(x['Description'], x['Title']), axis=1)
df
OUTPUT
Description Title col2
0 A Hello1 (AHello1, Hello1A)
1 B Hello2 (BHello2, Hello2B)
When you use .apply(func, axis=1), the function is applied line by line, and each line is the x. In other words, when you process the first line, x["Description"] is "A" and x["Title"] is "Hello2". As you can see, the lambda function written in your code does not use the x at any point, but it refers to the global df.
FOLLOW UP: to answer your question if we can have 2 columns:
df[["col1"]], df[["col2"]] = zip(*(df.apply(lambda x: myfunc(x['Description'], x['Title']), axis=1)))
OUTPUT
Description Title col1 col2
0 A Hello1 AHello1 Hello1A
1 B Hello2 BHello2 Hello2B