panda index drop delete data columns column python pandas copy

python - index - Pandas: asignaciones encadenadas



pandas delete (1)

He estado leyendo este enlace en "Devolución de una vista versus una copia". Realmente no entiendo cómo funciona el concepto de asignación encadenada en Pandas y cómo lo .ix() el uso de .ix() , .iloc() o .loc() .

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

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

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

Soy consciente de la advertencia a continuación y me gusta pensar que las advertencias en mi caso son falsos positivos:

Las advertencias / excepciones de asignación encadenadas apuntan a informar al usuario de una asignación posiblemente no válida. Puede haber falsos positivos; situaciones donde 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 objetivo de SettingWithCopy es advertir al usuario que puede estar haciendo algo que no actualizará el marco de datos original como podría esperarse.

Aquí, los data son un marco de data , posiblemente de un solo tipo (o no). A continuación, toma 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 se estaría preguntando por qué no se está actualizando.

Pandas devuelve una copia de un objeto en casi todas las llamadas a métodos. Las operaciones en el lugar son una operación conveniente que funciona, pero en general no está claro si los datos se están modificando y podrían funcionar en las 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 adicional para trabajar en copias. Puede encadenar operaciones, esto no es posible con las inplace .

p.ej

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

Y solo un FYI. inplace operaciones inplace no son ni más rápidas ni más eficientes en la memoria. my2c deberían ser prohibidos. Pero demasiado tarde en esa API.

Por supuesto, puedes desactivar 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 el encadenamiento está sucediendo), FYI.