Pourquoi n'est pas mon Pandas 'appliquer' la fonction de référencement de plusieurs colonnes de travail?

J'ai quelques problèmes avec les Pandas appliquer la fonction, lors de l'utilisation de plusieurs colonnes avec les éléments suivants dataframe

df = DataFrame ({'a' : np.random.randn(6),
                 'b' : ['foo', 'bar'] * 3,
                 'c' : np.random.randn(6)})

et de la fonction suivante

def my_test(a, b):
    return a % b

Lorsque j'essaie d'appliquer cette fonction avec :

df['Value'] = df.apply(lambda row: my_test(row[a], row[c]), axis=1)

Je reçois le message d'erreur:

NameError: ("global name 'a' is not defined", u'occurred at index 0')

Je ne comprends pas ce message, j'ai défini le nom correctement.

Je serais très reconnaissant de toute aide sur ce problème

Mise à jour

Merci pour votre aide. J'ai fait en effet quelques erreurs de syntaxe avec le code, l'indice devrait être de mise ". Cependant j'obtiens toujours la même question en utilisant une fonction plus complexe tels que:

def my_test(a):
    cum_diff = 0
    for ix in df.index():
        cum_diff = cum_diff + (a - df['a'][ix])
    return cum_diff 
  • Évitez d'utiliser des apply autant que possible. Si vous n'êtes pas sûr, vous avez besoin de l'utiliser, vous n'avez probablement pas. Je vous recommande de prendre un coup d'oeil à Quand dois-je besoin pour utiliser les pandas appliquer() dans mon code?.
  • C'est juste des erreurs de syntaxe référencement d'un dataframe de la colonne, et pourquoi les fonctions de besoin d'arguments. Quant à votre deuxième question, la fonction my_test(a) ne sais pas ce que df est puisqu'il n'était pas passé en argument (sauf df est censé être un mondial, ce qui serait terrible pratique). Vous devez passer toutes les valeurs que vous aurez besoin à l'intérieur d'une fonction en tant qu'arguments (de préférence dans l'ordre), sinon, comment d'autre de la fonction de savoir où df vient d'où? Aussi, c'est une mauvaise pratique de programme dans un espace de noms jonché de variables globales, on ne prends pas les erreurs de ce genre.
InformationsquelleAutor Andy | 2013-05-03