Saltar al contenido

¿Cómo mapear una función usando múltiples columnas en pandas?

Solución:

Usar pd.DataFrame.apply(), como a continuación:

df['d'] = df.apply(lambda x: some_func(a = x['a'], b = x['b'], c = x['c']), axis=1)

NOTA: Como @ashishsingal preguntó acerca de las columnas, el axis El argumento debe proporcionarse con un valor de 1, ya que el valor predeterminado es 0 (como en la documentación y se copia a continuación).

eje: {0 o ‘índice’, 1 o ‘columnas’}, 0 por defecto

  • 0 o ‘índice’: aplica la función a cada columna
  • o ‘columnas’: aplica la función a cada fila

Estoy usando lo siguiente:

df['d'] = df.apply(lambda x: some_func(a = x['a'], b = x['b'], c = x['c']))

Parece que funciona bien, pero si alguien más tiene una solución mejor, hágamelo saber.

Por lo que vale en una pregunta tan antigua; Encuentro que comprimir los argumentos de la función en tuplas y luego aplicar la función como una lista de comprensión es mucho más rápido que usar df.apply. Por ejemplo:

import pandas as pd

# Setup:
df = pd.DataFrame(np.random.rand(10000, 3), columns=list("abc"))
def some_func(a, b, c):
    return a*b*c

# Using apply:
%timeit df['d'] = df.apply(lambda x: some_func(a = x['a'], b = x['b'], c = x['c']), axis=1)

222 ms ± 63,8 ms por bucle (media ± desviación estándar de 7 corridas, 1 bucle cada una)

# Using tuples + list comprehension:
%timeit df["d"] = [some_func(*a) for a in tuple(zip(df["a"], df["b"], df["c"]))]

8,07 ms ± 640 µs por bucle (media ± desviación estándar de 7 corridas, 100 bucles cada una)

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *