Elimine los valores atípicos (+/- 3 std) y reemplácelos con np.nan en Python / pandas
He visto varias soluciones que se acercan a resolver mi problema.
pero no me han ayudado a tener éxito hasta ahora.
Creo que la siguiente solución es lo que necesito, pero continúo recibiendo un error (y no tengo los puntos de reputación para comentarlo o cuestionarlo):enlazar
(Recibo el siguiente error, pero no entiendo dónde.copy()
o agrega un "inplace=True
"al administrar el siguiente comandodf2=df.groupby('install_site').transform(replace)
:
SettingWithCopyWarning: se está intentando establecer un valor en una copia de un segmento de un DataFrame. Intenta usar.loc[row_indexer,col_indexer] = value
en lugar
Vea las advertencias en la documentación:enlazar
Entonces, intenté crear mi propia versión, pero sigo atascado. Aquí va.
Tengo un marco de datos indexado por tiempo con columnas para el sitio (valores de cadena para muchos sitios diferentes) y valores flotantes.
time_index site val
Me gustaría ir a través de la columna 'val', agrupada por sitio, y reemplazar cualquier valor atípico (esas desviaciones estándar de +/- 3 de la media) con un NaN (para cada grupo).
Cuando uso la siguiente función, no puedo indexar el marco de datos con mi vector de Verdadero / Falso:
def replace_outliers_with_nan(df, stdvs):
dfnew=pd.DataFrame()
for i, col in enumerate(df.sites.unique()):
dftmp = pd.DataFrame(df[df.sites==col])
idx = [np.abs(dftmp-dftmp.mean())<=(stdvs*dftmp.std())] #boolean vector of T/F's
dftmp[idx==False]=np.nan #this is where the problem lies, I believe
dfnew[col] = dftmp
return dfnew
Además, me temo que la función anterior tomará mucho tiempo en más de 7 millones de filas, por lo que esperaba usar la opción de función groupby.