提前感谢您的帮助。
#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()
附加到返回行,具体取决于如何使用它的返回值。
可变数量的参数也包括零,所以您可能需要添加一个检查。