Pandas: tareas encadenadas

He estado leyendo este enlace en “Devolver una vista frente a una copia“. Realmente no entiendo cómo funciona el concepto de asignación encadenada en Pandas y cómo el uso de .ix() , .iloc() o .loc() afecta.

Recibo las advertencias de SettingWithCopyWarning para las siguientes líneas de códigos, donde los data son un marco de data Panda y la amount es un nombre de columna (Serie) en ese dataframe:

 data['amount'] = data['amount'].astype(float) data["amount"].fillna(data.groupby("num")["amount"].transform("mean"), inplace=True) data["amount"].fillna(mean_avg, inplace=True) 

Mirando este código, ¿es obvio que estoy haciendo algo subóptimo? Si es así, ¿puedes hacerme saber las líneas de código de reemplazo?

Soy consciente de la siguiente advertencia y me gusta pensar que las advertencias en mi caso son falsos positivos:

Las advertencias / excepciones de la asignación encadenada tienen como objective informar al usuario de una asignación posiblemente no válida. Puede haber falsos positivos; situaciones en las que una asignación encadenada se informa inadvertidamente.

EDITAR: el código que conduce al primer error de advertencia de copia.

 data['amount'] = data.apply(lambda row: function1(row,date,qty), axis=1) data['amount'] = data['amount'].astype(float) def function1(row,date,qty): try: if(row['currency'] == 'A'): result = row[qty] else: rate = lookup[lookup['Date']==row[date]][row['currency'] ] result = float(rate) * float(row[qty]) return result except ValueError: # generic exception clause print "The current row causes an exception:" 

El objective de SettingWithCopy es advertir al usuario que puede estar haciendo algo que no actualizará el dataframe original como se podría esperar.

Aquí, los data son un marco de data , posiblemente de un solo tipo de texto (o no). Luego está tomando una referencia a estos data['amount'] que es una Serie, y la actualiza. Probablemente esto funcione en su caso porque está devolviendo el mismo tipo de datos que existía.

Sin embargo, podría crear una copia que actualice una copia de los data['amount'] que no vería; Entonces te estarías preguntando por qué no se está actualizando.

Pandas devuelve una copia de un objeto en casi todas las llamadas de método. Las operaciones inplace son una operación de conveniencia que funciona, pero en general no está claro si los datos se están modificando y podrían funcionar en copias.

Mucho más claro para hacer esto:

 data['amount'] = data["amount"].fillna(data.groupby("num")["amount"].transform("mean")) data["amount"] = data['amount'].fillna(mean_avg) 

Una ventaja más para trabajar en las copias. Puede encadenar operaciones, esto no es posible con las inplace .

p.ej

 data['amount'] = data['amount'].fillna(mean_avg)*2 

Y sólo un FYI. inplace operaciones inplace no son más rápidas ni más eficientes en memoria. my2c deben ser prohibidos. Pero demasiado tarde en esa API.

Por supuesto, puedes apagar esto:

 pd.set_option('chained_assignment',None) 

Pandas se ejecuta con todo el conjunto de pruebas con este conjunto para raise (para que sepamos si está ocurriendo el encadenamiento) encendido, FYI.