Confusión re: copia de pandas de advertencia de segmento de datos
He revisado un montón de preguntas y respuestas relacionadas con este problema, pero todavía encuentro que recibo esta copia de la advertencia de corte en lugares donde no lo espero. Además, está surgiendo en el código que funcionaba bien para mí anteriormente, lo que me lleva a preguntarme si algún tipo de actualización puede ser el culpable.
Por ejemplo, este es un conjunto de código donde todo lo que estoy haciendo es leer en un archivo Excel en pandasDataFrame
y reduciendo el conjunto de columnas incluidas con eldf[[]]
sintaxis.
izmir = pd.read_excel(filepath)
izmir_lim = izmir[['Gender','Age','MC_OLD_M>=60','MC_OLD_F>=60','MC_OLD_M>18','MC_OLD_F>18','MC_OLD_18>M>5','MC_OLD_18>F>5',
'MC_OLD_M_Child<5','MC_OLD_F_Child<5','MC_OLD_M>0<=1','MC_OLD_F>0<=1','Date to Delivery','Date to insert','Date of Entery']]
Ahora, cualquier otro cambio que haga a estoizmir_lim
archivo elevar la copia de advertencia de corte.
izmir_lim['Age'] = izmir_lim.Age.fillna(0)
izmir_lim['Age'] = izmir_lim.Age.astype(int)
/Users/samlilienfeld/anaconda/lib/python3.5/site-packages/ipykernel/principal.py: 2: SettingWithCopyWarning: se está intentando establecer un valor en una copia de un segmento de un DataFrame. Intente usar .loc [row_indexer, col_indexer] = value en su lugar
Estoy confundido porque pensé que eldf[[]]
El subconjunto de columnas devolvió una copia por defecto. La única forma en que he encontrado para suprimir los errores es agregando explícitamentedf[[]].copy()
. Podría haber jurado que en el pasado no tenía que hacer eso y no planteé la copia del error de corte.
Del mismo modo, tengo otro código que ejecuta una función en un marco de datos para filtrarlo de ciertas maneras:
def lim(df):
if (geography == "All"):
df_geo = df
else:
df_geo = df[df.center_JO == geography]
df_date = df_geo[(df_geo.date_survey >= start_date) & (df_geo.date_survey <= end_date)]
return df_date
df_lim = lim(df)
A partir de este momento, cualquier cambio que realice en cualquiera de los valores dedf_lim
elevar la copia del error de corte. La única forma de evitarlo que he encontrado es cambiar la llamada de función a:
df_lim = lim(df).copy()
Esto me parece mal. ¿Qué me estoy perdiendo? Parece que estos casos de uso deberían devolver copias de forma predeterminada, y podría haber jurado que la última vez que ejecuté estos scripts no estaba ejecutando estos errores.
¿Solo necesito comenzar a agregar.copy()
¿por todo el lugar? Parece que debería haber una forma más limpia de hacer esto. Cualquier idea o ayuda es muy apreciada.