Добавить параметр в функцию eval, которая применяется к pd.df - PullRequest
0 голосов
/ 29 апреля 2020

У меня есть программа, подобная приведенной ниже, она прекрасно работает, когда у каждой функции есть только один параметр.

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)

Но я добавил еще один параметр к каждой функции, она вернула ошибку:

TypeError: 'int' object is not callable. 

Как я могу заставить его работать с двумя параметрами?

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)

1 Ответ

2 голосов
/ 29 апреля 2020

Вы можете отдельно передавать свои аргументы в функцию .apply, используя параметр args , как показано ниже

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)

Вывод:

0    3
Name: number, dtype: int64

Надеюсь, это поможет!

...