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 quedf
est puisqu'il n'était pas passé en argument (saufdf
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.
Vous devez vous connecter pour publier un commentaire.
Semble que vous avez oublié le
''
de votre chaîne.BTW, à mon avis, à la suite de façon plus élégante:
pythonista
en raison de certains points de vue, y compris celui-ci.axis=1
est important iciSi vous voulez juste pour calculer (colonne) % (colonne b), vous n'avez pas besoin
apply
, il suffit de faire directement:Disons que nous voulons appliquer une fonction add5 pour les colonnes " a " et " b " de DataFrame df
Toutes les suggestions ci-dessus, mais si vous voulez que vos calculs pour de plus efficace, vous devez prendre avantage de numpy vecteur opérations (comme indiqué ici).
Exemple 1: boucle avec
pandas.apply()
:Exemple 2: vectoriser l'aide de
pandas.apply()
:Exemple 3: vectoriser à l'aide de tableaux numpy:
Donc de la vectorisation à l'aide de tableaux numpy l'amélioration de la vitesse de près de deux ordres de grandeur.
C'est la même que la solution précédente, mais je l'ai défini la fonction dans le df.appliquer lui-même:
J'ai donné la comparaison de tous les trois discuté ci-dessus.
À l'aide de valeurs
139 µs ± 1.91 µs par boucle (moyenne ± std. dev. de 7 pistes, 10000 boucles de chaque)
Sans valeurs
216 µs ± 1.86 µs par boucle (moyenne ± std. dev. de 7 pistes, 1000 boucles de chaque)
Appliquer la fonction
474 µs ± 5.07 µs par boucle (moyenne ± std. dev. de 7 pistes, 1000 boucles de chaque)