Tengo algunos problemas con la función de aplicación Pandas, cuando uso varias columnas con el siguiente marco de datos
df = DataFrame ({'a' : np.random.randn(6),
'b' : ['foo', 'bar'] * 3,
'c' : np.random.randn(6)})
y la siguiente función
def my_test(a, b):
return a % b
Cuando trato de aplicar esta función con:
df['Value'] = df.apply(lambda row: my_test(row[a], row[c]), axis=1)
Me sale el mensaje de error:
NameError: ("global name 'a' is not defined", u'occurred at index 0')
No entiendo este mensaje, definí el nombre correctamente.
Agradecería cualquier ayuda sobre este tema
Actualizar
Gracias por tu ayuda. Realmente cometí algunos errores de sintaxis con el código, el índice debería ser puesto ''. Sin embargo, sigo teniendo el mismo problema usando una función más compleja como:
def my_test(a):
cum_diff = 0
for ix in df.index():
cum_diff = cum_diff + (a - df['a'][ix])
return cum_diff
my_test(a)
no sabe qué df
es, ya que no se pasó como argumento (a menos que df
se suponga que es global, lo que sería una práctica terrible). Debe pasar todos los valores que necesitará dentro de una función como argumentos (preferiblemente en orden), de lo contrario, ¿de qué otra manera la función sabría de dónde df
viene? Además, es una mala práctica programar en un espacio de nombres lleno de variables globales, no detectará errores como este.
apply
tanto como sea posible. Si no está seguro de que necesita usarlo, probablemente no. Recomiendo echar un vistazo a ¿ Cuándo debería utilizar pandas apply () en mi código? .