If you want to get the function name, another option is using f.__name__
. Example:
def mysum(X):
return 2 + X
def foo(X, function):
return pd.Series({
function.__name__: function(X), 'func_name': function.__name__})
df.join(df.A.apply(foo, function=mysum))
A mysum func_name
0 1 3 mysum
1 1 3 mysum
2 2 4 mysum
3 4 6 mysum
4 10 12 mysum
def myprod(X):
return 2 * X
df.join(df.A.apply(foo, function=myprod))
A myprod func_name
0 1 2 myprod
1 1 2 myprod
2 2 4 myprod
3 4 8 myprod
4 10 20 myprod
I assume you are already familiar with the pitfalls of using apply
this way. I've written this under the assumption that your function is a stand-in for something a lot more complex. But in general, you should try to vectorize where possible.
If you want more flexibility naming the output column, you can add a keyword argument name
:
def foo(X, function, name=None):
name = name if name else function.__name__
return pd.Series({
name: function(X), 'func_name': function.__name__})
df.join(df.A.apply(foo, function=mysum, name='sum'))
A sum func_name
0 1 3 mysum
1 1 3 mysum
2 2 4 mysum
3 4 6 mysum
4 10 12 mysum