Search code examples
pythonpandasdataframeapplyeval

Add a parameter to eval function that is applied to pd.df


I have a program like below, it works fine when each function has only one parameter.

import pandas as pd

df = pd.DataFrame([1])
df.columns = ['number']

def add_one(x):
    return x+1

def add_two(x):
    return x+2

class Functions:
    add_one = "add_one"
    add_two = "add_two"

def main(df, func_name):
    return df.number.apply(eval(func_name))

func_name = Functions.add_one

main(df, func_name)

But I added another parameter to each function, it returned an error:

TypeError: 'int' object is not callable. 

How can I make it work with two parameters?

import pandas as pd

df = pd.DataFrame([1])
df.columns = ['number']


def add_one(x, a):
    return x+1+a

def add_two(x, a):
    return x+2+a

class Functions:
    add_one = "add_one"
    add_two = "add_two"

def main(df, func_name):
    a = 1
    return df.number.apply(eval(func_name + '(x, a)'))

func_name = Functions.add_one

main(df, func_name)

Solution

  • You can pass your arguments separately to the .apply function using the args parameter as shown below.

    import pandas as pd
    
    df = pd.DataFrame([1])
    df.columns = ['number']
    
    
    def add_one(x, a):
        return x+1+a
    
    def add_two(x, a):
        return x+2+a
    
    class Functions:
        add_one = "add_one"
        add_two = "add_two"
    
    def main(df, func_name):
        a = 1
        return df.number.apply(eval(func_name), args=(a,))
    
    func_name = Functions.add_one
    
    main(df, func_name)
    

    Output:

    0    3
    Name: number, dtype: int64