首页 > 解决方案 > 如果使用一个或多个参数,如何传递函数参数

问题描述

预先感谢您的协助。

#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、*kargs、映射和许多东西,但都没有运气。我的感觉是我很接近,但需要一种方法来告诉函数有时可能有一个、两个或三个参数,然后将一个、两个或三个参数映射到创建的数据帧。

标签: pandasfuncargs

解决方案


听起来您只想按特定顺序从数据框中选择一些列。您可以为此传递列名列表:

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")

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

需要调用 to list,因为元组解包会产生一个元组。并且使用元组作为数据框的索引会产生与使用列表不同的结果。

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

可变数量的参数也包括零,因此您可能需要为此添加检查。


推荐阅读