Tengo un marco de datos de pandas df con el siguiente tipo de datos:

+------+------+--+
| Col1 | Col2 |  |
+------+------+--+
| abc  |  123 |  |
| abc  |  234 |  |
| cde  |  123 |  |
| cde  |  234 |  |
| ghi  |  455 |  |
| ghi  |  755 |  |
| ghi  |  123 |  |
+------+------+--+

En otro lugar, tengo una función que toma un valor del marco de datos como entrada. Entonces, por ejemplo, my_func(arg1, arg2, str_from_df). Lo que me gustaría hacer es reemplazar los valores en Col1 con el valor de retorno de my_func cuando el retorno de my_func no es None. Una forma de hacer esto es recorrer el marco de datos y cambiar cada valor en Col1, uno a la vez. Pero esta es una solución muy lenta. También es ineficiente en mi caso, porque solo necesito devolver el valor de una llamada a my_func por grupo de Col1.

¿Puedo cambiar todos los abc en Col1 al mismo tiempo? Es decir, pruebe si, por ejemplo, my_func(arg1, arg2, df['Col2'].iat[0]) es None (el valor correspondiente a la primera instancia de abc en Col2), y si no, use su valor para reemplazar TODOS Valores de abc en Col1. El marco de datos está cerca de 1M filas, y la función en sí no es insignificante, por lo que me gustaría llamarla con la menor frecuencia posible. También debo mencionar que quiero que los demás datos permanezcan intactos. Se puede hacer esto? ¿Quizás una función lambda?

0
user3934100 12 oct. 2020 a las 21:43

1 respuesta

La mejor respuesta

Dado que desea aplicar la función en un grupo de filas que tienen el mismo valor de col1, puede usar groupby() y transform()

 df['Col1'] = df.groupby('Col1')['Col2'].transform(my_func)

Además, sobre el valor de None vs Col1, puede manejarlo dentro del my_func como

def my_func(e):

  
  result = #your logic
  return result if result!=None else e 
1
A.B 12 oct. 2020 a las 18:54