web-dev-qa-db-fra.com

Passer une fonction avec plusieurs arguments à DataFrame.apply

Supposons que j'ai une trame de données comme celle-ci:

df = pd.DataFrame([['foo', 'x'], ['bar', 'y']], columns=['A', 'B'])


       A    B
0    foo    x
1    bar    y

Je sais comment utiliser une fonction d'argument unique avec Apply en ce qui concerne les cadres de données, comme ceci:

def some_func(row):
    return '{0}-{1}'.format(row['A'], row['B'])

df['C'] = df.apply(some_func, axis=1)

df


       A    B        C
0    foo    x    foo-x
1    bar    y    bar-y

Comment puis-je utiliser Apply sur les cadres de données lorsqu'ils impliquent plusieurs arguments d'entrée? Voici un exemple de ce que je veux:

def some_func(row, var1):
    return '{0}-{1}-{2}'.format(row['A'], row['B'], var1)

df['C'] = df.apply(some_func(row, var1='DOG'), axis=1)

df


       A    B            C
0    foo    x    foo-x-DOG
1    bar    y    bar-y-DOG

Je ne cherche pas de solutions pour résoudre cet exemple particulier, juste comment faire quelque chose comme ça en général. Tout conseil serait bien apprécié, merci.

10
Michael Henry

C'est comme vous le pensez, apply accepte args et kwargs et les transmet directement à some_func.

df.apply(some_func, var1='DOG', axis=1)

Ou,

df.apply(some_func, args=('DOG', ), axis=1)
0    foo-x-DOG
1    bar-y-DOG
dtype: object
7
cs95

Vous devez utiliser une logique vectorisée:

df['C'] = df['A'] + '-' + df['B'] + '-DOG'

Si vous voulez vraiment utiliser df.apply, qui est juste une boucle finement voilée , vous pouvez simplement alimenter vos arguments en paramètres supplémentaires:

def some_func(row, var1):
    return '{0}-{1}-{2}'.format(row['A'], row['B'], var1)

df['C'] = df.apply(some_func, var1='DOG', axis=1)

Selon les documents , df.apply accepte les arguments de position et de mot clé.

3
jpp

Je pense que ça peut être

df.apply('-'.join,1)+'-DOG'
Out[157]: 
0    foo-x-DOG
1    bar-y-DOG
dtype: object
1
YOBEN_S