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)