Dataframe Aplicar el método para devolver múltiples elementos (series)

import pandas as pd 

Digamos que tengo un dataframe así:

 df = pd.DataFrame({"a":range(4),"b":range(1,5)}) 

se parece a esto:

  ab 0 0 1 1 1 2 2 2 3 3 3 4 

y una función que multiplica X por Y:

 def XtimesY(x,y): return x*y 

Si quiero agregar una nueva serie de pandas a df puedo hacer:

 df["c"] =df.apply( lambda x:XtimesY(x["a"],2), axis =1) 

Funciona !

Ahora quiero añadir varias series:

Tengo esta función:

 def divideAndMultiply(x,y): return x/y, x*y 

algo como esto ?:

 df["e"], df["f"] = df.apply( lambda x: divideAndMultiply(x["a"],2) , axis =1) 

¡No funciona!

¡Quiero que la columna 'e' reciba las divisiones y 'f' columna 'f' las multiplicaciones!

Nota: este no es el código que estoy usando, pero estoy esperando el mismo comportamiento.

ACTUALIZAR

Actualizado para la versión 0.23 – usando result_type='broadcast' para más detalles, consulte la documentación

Redefina su función de esta manera:

 def divideAndMultiply(x,y): return [x/y, x*y] 

Entonces haz esto:

 df[['e','f']] = df.apply(lambda x: divideAndMultiply(x["a"], 2), axis=1, result_type='broadcast') 

Obtendrá el resultado deseado:

 In [118]: df Out[118]: abef 0 0 1 0 0 1 1 2 0 2 2 2 3 1 4 3 3 4 1 6 

Casi allí. Use zip * para descomprimir la función. Prueba esto:

 def divideAndMultiply(x,y): return x/y, x*y df["e"], df["f"] = zip(*df.a.apply(lambda val: divideAndMultiply(val,2))) 
 df["e"], df["f"] = zip(*df.apply( lambda x: divideAndMultiply(x["a"],2) , axis =1)) 

Debería hacer el truco.

(Muestro este ejemplo para que pueda ver cómo usar varias columnas como entrada para crear varias columnas nuevas)

La siguiente solución a esta frustrante y frustrante pregunta me funciona. Encontré la sugerencia original en otra publicación de StackOverflow hace un tiempo. El truco es envolver los valores de retorno en una serie como esta:

 def divideAndMultiply(x,y): return pd.Series([x/y, x*y]) 

Entonces esto funciona como quisieras:

 df[['e','f']] = df.apply( lambda x: divideAndMultiply(x["a"],2) , axis =1)