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.

enlace1 link2

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.

Respuestas a la pregunta(1)

Su respuesta a la pregunta