Как передать большое количество аргументов в ** kwargs

У меня есть следующий фреймворк:

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

Я разделяю столбцы 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']))

Я хочу знать, есть ли более простой способ передать эти аргументы (скажем, предположим, что мой раскол столбца имеет более 15-20 столбцов. Как я могу передать эти многие аргументы более простым способом)...???

Заранее спасибо...

3 ответа

Создайте set позиционных аргументов, таких как:

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

Следующий фильтр из kwargs, как:

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

Если вы используете python-2.7, ^ работает только на set.

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

Функция вызова:

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


Не уверен, что это то, что вы хотите, но вы можете поместить нужные вам столбцы в отдельный список и генерировать аргументы, когда они вам понадобятся.

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


Это то, что вы ищете?

Вы можете передать dict в kwargs следующим образом:

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

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

func(**d)

licensed under cc by-sa 3.0 with attribution.