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
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? .my_test(a)
no sabe quédf
es, ya que no se pasó como argumento (a menos quedf
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óndedf
viene? Además, es una mala práctica programar en un espacio de nombres lleno de variables globales, no detectará errores como este.Respuestas:
Parece que olvidaste el
''
de tu cuerda.Por cierto, en mi opinión, la siguiente forma es más elegante:
fuente
pythonista
debido a algunas perspectivas, incluida esta.Si solo desea calcular (columna a)% (columna b), no necesita
apply
, simplemente hágalo directamente:fuente
Digamos que queremos aplicar una función add5 a las columnas 'a' y 'b' de DataFrame df
fuente
Todas las sugerencias anteriores funcionan, pero si desea que sus cálculos sean más eficientes, debe aprovechar las operaciones de vectores numpy (como se señala aquí) .
Ejemplo 1: bucle con
pandas.apply()
:Ejemplo 2: vectorizar usando
pandas.apply()
:Ejemplo 3: vectorizar usando matrices numpy:
Por lo tanto, la vectorización con matrices numpy mejoró la velocidad en casi dos órdenes de magnitud.
fuente
Esto es lo mismo que la solución anterior, pero he definido la función en df.
fuente
He dado la comparación de los tres discutidos anteriormente.
Usando valores
139 µs ± 1.91 µs por bucle (media ± desviación estándar de 7 corridas, 10000 bucles cada una)
Sin valores
216 µs ± 1.86 µs por ciclo (media ± estándar de desarrollo de 7 carreras, 1000 ciclos cada una)
Aplicar función
474 µs ± 5.07 µs por ciclo (media ± estándar de desarrollo de 7 carreras, 1000 ciclos cada una)
fuente