如何将大量参数传递给** kwargs

时间:2018-01-15 10:43:29

标签: python pandas dataframe

我有以下数据框:

   p     p_loc  s            s0  s0_loc  s1  s1_loc  s2 s2_loc  s3   s3_loc
0  ABCD  M      AB,AC,AD     AB  A       AC   M      AD  Q      NaN  U
1  PQRS  N      PQ,PR,PS,QR  PQ  B       PR   N      PS  R      QR   V

我正在使用as作为分隔符将列s分成s0,s1,s2,s3列。 我想将值从s0,s1,s2,s3,s4,s5,s0_loc,s1_loc,s2_loc,s3_loc传递给以下接受以下参数的函数:

def func(p,p_loc,**args):
    print(p)
    print(p_loc)
    print(kwargs)

我传递的论点如下:

df['new'] = df.apply(lambda x: func(df['p'],df['p_loc'],df['s0'],df['s1'],df['s2'],df['s3'],df['s0_loc'],df['s1_loc'],df['s2_loc'],df['s3_loc']))

我想知道有没有更简单的方法来传递这些参数(比如说,假设我的列s的拆分导致超过15-20列。我怎样才能以更简单的方式传递这些参数)... ???

提前致谢...

3 个答案:

答案 0 :(得分:2)

创建set位置参数,例如:

>>> not_kwargs = {'p', 'p_loc', 's'}

接下来过滤掉像:

这样的kwargs
>>> data = df.to_dict()
>>> kwargs = {key:data[key] for key in data.keys() ^ not_kwargs}

如果您使用的是,则^仅适用于set

>>> kwargs = {key:data[key] for key in set(data.keys()) ^ not_kwargs}

通话功能:

>>> func(data['p'], data['p_loc'], **kwargs)

答案 1 :(得分:1)

不确定这是否是您想要的,但您可以将所需的列放在单独的列表中,并在需要时生成参数。

def func(p, p_loc, *args):
    print(p)
    print(p_loc)
    print(args)

list_of_cols = ['s0', 's1', 's2', 's3', 's0_loc', 's1_loc', 's2_loc','s3_loc']
df['new'] = df.apply(lambda x: func(df['p'], df['p_loc'], *[df[col] for col in list_of_cols]))

答案 2 :(得分:1)

这是你要找的吗?

你可以将dict传递给这样的kwargs:

d = {
    'p': df['p'],
    'p_loc': df['p_loc'],
    's0': df['s0'],
    's1': df['s1'],
    ...
    }

def func(**kwargs):
    print(kwargs)

func(**d)