如果使用一个或多个参数,如何传递函数参数



提前感谢您的帮助。

#Create df.
import pandas as pd 

d = {'dep_var' : pd.Series([10, 20, 30, 40], index =['a', 'b', 'c', 'd']), 
'one' : pd.Series([9, 23, 37, 41], index =['a', 'b', 'c', 'd']),
'two' : pd.Series([1, 6, 5, 4], index =['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d) 
print(df)
dep_var  one  two
a       10    9    1
b       20   23    6
c       30   37    5
d       40   41    4

#Define function.
def df_two(dep_var, ind_var_1, ind_var_2):
global two
data = {
dep_var: df[dep_var],
ind_var_1: df[ind_var_1],
ind_var_2: df[ind_var_2]

}

two = pd.DataFrame(data)
return two
# Execute function.
df_two("dep_var", "one", "two")

dep_var one two
a   10  9   1
b   20  23  6
c   30  37  5
d   40  41  4

效果完美。我希望,在使用三个或四个参数时,能够使用一个函数,当然,使用上面的代码,我会得到第三个参数的错误消息。

所以菜鸟移动我定义了另一个有3个参数的函数。

def df_three(dep_var, ind_var_1, ind_var_2, ind_var_3):
global three
data = {
dep_var: df[dep_var],
ind_var_1: df[ind_var_1],
ind_var_2: df[ind_var_2],
ind_var_3: df[ind_var_2]

}

three = pd.DataFrame(data)
return three

我尝试过args、卡丁车、地图和很多东西,但都没有成功。我的感觉是,我很接近,但需要一种方法来告诉函数,有时可能有一个、两个或三个参数,然后将一个、二个或三个子参数映射到创建的数据帧。

使用解包*args:

def foo(dep_var, *args):
global df
data = {dep_var: df[dep_var]}
for a in args:
data[a] = df[a]

return pd.DataFrame(data)

然后你可以打电话给

foo('dep_var', 'one')
foo('dep_var', 'one', 'two')

为了消除global参数的需要,我还将df传递给函数:

def foo(df, dep_var, *args):
data = {dep_var: df[dep_var]}
for a in args:
data[a] = df[a]

return pd.DataFrame(data)

有关*args的详细信息。

听起来您只想按特定顺序从数据帧中选择一些列。您只需传递一个列名列表即可:

two[["dep_var", "one", "two"]]

如果愿意,可以将其打包到一个函数中,使用元组拆包来获得可变数量的参数。

def select(df, *columns):
return df[list(columns)]

这应该直接适用于您的用例:

select(two, "dep_var", "one", "two")
select(three, "dep_var", "one", "two", "three")

请注意,我还传递了数据帧变量,因此您不需要依赖全局变量。

需要调用list,因为元组拆包会生成一个元组。使用元组作为数据帧的索引会产生与使用列表不同的结果。

您可能希望将.copy()附加到返回行,具体取决于如何使用它的返回值。

可变数量的参数也包括零,所以您可能需要添加一个检查。

最新更新