J'ai des problèmes avec la fonction d'application Pandas, lorsque j'utilise plusieurs colonnes avec le cadre de données suivant
df = DataFrame ({'a' : np.random.randn(6),
'b' : ['foo', 'bar'] * 3,
'c' : np.random.randn(6)})
et 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 bien défini le nom.
J'apprécierais grandement toute aide sur cette question
Mettre à jour
Merci de votre aide. J'ai en effet fait quelques erreurs de syntaxe avec le code, l'index devrait être mis ''. Cependant, je reçois toujours le même problème en utilisant une fonction plus complexe telle que:
def my_test(a):
cum_diff = 0
for ix in df.index():
cum_diff = cum_diff + (a - df['a'][ix])
return cum_diff
apply
autant que possible. Si vous n'êtes pas sûr de devoir l'utiliser, ce n'est probablement pas le cas. Je recommande de jeter un œil à Quand devrais-je jamais vouloir utiliser pandas apply () dans mon code? .my_test(a)
ne sait pas ce qu'elledf
est car elle n'a pas été passée en argument (sauf si elledf
est supposée être globale, ce qui serait une pratique terrible). Vous devez passer toutes les valeurs dont vous aurez besoin dans une fonction comme arguments (de préférence dans l'ordre), sinon comment la fonction pourrait-elle savoir d'oùdf
vient-elle? De plus, c'est une mauvaise pratique de programmer dans un espace de noms jonché de variables globales, vous n'attraperez pas d'erreurs comme celle-ci.Réponses:
Semble que vous avez oublié le
''
de votre chaîne.BTW, à mon avis, la manière suivante est plus élégante:
la source
pythonista
dû à certaines perspectives, y compris celle-ci.Si vous voulez juste calculer (colonne a)% (colonne b), vous n'avez pas besoin
apply
, faites-le directement:la source
Disons que nous voulons appliquer une fonction add5 aux colonnes 'a' et 'b' de DataFrame df
la source
Toutes les suggestions ci-dessus fonctionnent, mais si vous voulez que vos calculs soient plus efficaces, vous devriez profiter des opérations vectorielles numpy (comme indiqué ici) .
Exemple 1: boucle avec
pandas.apply()
:Exemple 2: vectoriser en utilisant
pandas.apply()
:Exemple 3: vectoriser en utilisant des tableaux numpy:
La vectorisation à l'aide de tableaux numpy a donc amélioré la vitesse de près de deux ordres de grandeur.
la source
C'est la même chose que la solution précédente mais j'ai défini la fonction dans df.apply lui-même:
la source
J'ai donné la comparaison des trois ci-dessus.
Utiliser des valeurs
139 µs ± 1,91 µs par boucle (moyenne ± écart standard de 7 pistes, 10000 boucles chacune)
Sans valeurs
216 µs ± 1,86 µs par boucle (écart moyen ± standard de 7 passages, 1000 boucles chacun)
Appliquer la fonction
474 µs ± 5,07 µs par boucle (écart moyen ± standard de 7 passages, 1000 boucles chacun)
la source