Tengo un marco de datos de pandas con pocas columnas.
Ahora sé que ciertas filas son valores atípicos basados en un cierto valor de columna.
Por ejemplo
la columna 'Vol' tiene todos los valores
12xx
y un valor es4000
(atípico).
Ahora me gustaría excluir esas filas que tienen una Vol
columna como esta.
Entonces, esencialmente necesito poner un filtro en el marco de datos de modo que seleccionemos todas las filas donde los valores de una determinada columna están dentro, por ejemplo, de 3 desviaciones estándar de la media.
¿Cuál es una forma elegante de lograr esto?
Use la
boolean
indexación como lo haría ennumpy.array
Para una serie es similar:
fuente
DataFrame.abs()
FYI, tambiénDataFrame.clip()
clip()
Jeff, los contornos no se eliminan:df.SOME_DATA.clip(-3std,+3std)
asigne los delineadores a + 3std o -3stddf_new = df[np.abs(df - df.mean()) <= (3 * df.std())]
. Pero a diferencia de aplicarlo a una serie o columna única, esto reemplazará los valores atípicosnp.nan
y mantendrá la forma del DataFrame, por lo que podría ser necesaria la interpolación para completar los valores faltantes.Para cada una de las columnas de su marco de datos, puede obtener cuantiles con:
y luego filtrar con:
Si necesita eliminar valores atípicos superiores e inferiores, combine la condición con una declaración AND:
fuente
Esta respuesta es similar a la proporcionada por @tanemaki, pero usa una
lambda
expresión en lugar descipy stats
.Para filtrar el DataFrame donde solo UNA columna (por ejemplo, 'B') está dentro de tres desviaciones estándar:
Vea aquí cómo aplicar esta puntuación z de forma continua: Puntuación Z continua aplicada al marco de datos de pandas
fuente
fuente
Para cada serie en el marco de datos, puede usar
between
yquantile
eliminar valores atípicos.fuente
Como no he visto una respuesta que se ocupe de numéricos y no numéricos atributos , aquí hay una respuesta complementaria.
Es posible que desee eliminar los valores atípicos solo en atributos numéricos (las variables categóricas difícilmente pueden ser valores atípicos).
Definición de la función
He extendido la sugerencia de @ tanemaki para manejar datos cuando los atributos no numéricos también están presentes:
Uso
Ejemplo
Imagine un conjunto de datos
df
con algunos valores sobre casas: callejón, contorno del terreno, precio de venta, ... Por ejemplo: documentación de datosPrimero, desea visualizar los datos en un gráfico de dispersión (con z-score Thresh = 3):
fuente
reduce=False
pandas
result_type='reduce'
porreduce=False
.scipy.stats
tiene métodostrim1()
ytrimboth()
para cortar los valores atípicos en una sola fila, de acuerdo con la clasificación y un porcentaje introducido de valores eliminados.fuente
trimboth
Fue más fácil para mí.Otra opción es transformar sus datos para mitigar el efecto de los valores atípicos. Puedes hacerlo ganando información a tus datos.
fuente
Si le gusta el encadenamiento de métodos, puede obtener su condición booleana para todas las columnas numéricas como esta:
Cada valor de cada columna se convertirá en
True/False
función de si está a menos de tres desviaciones estándar de la media o no.fuente
le(3)
desde su eliminación de valores atípicos. De esta manera, obtienesTrue
los valores atípicos. Además de eso +1 y esta respuesta debería estar más arribaPuedes usar la máscara booleana:
salida:
fuente
Como estoy en una etapa muy temprana de mi viaje de ciencia de datos, estoy tratando los valores atípicos con el siguiente código.
fuente
Obtenga el percentil 98 y 2 como los límites de nuestros valores atípicos
fuente
A continuación se muestra un ejemplo completo con datos y 2 grupos:
Importaciones:
Ejemplo de datos con 2 grupos: G1: Grupo 1. G2: Grupo 2:
Leer datos de texto en el marco de datos de pandas:
Definir los valores atípicos utilizando desviaciones estándar
Defina los valores de datos filtrados y los valores atípicos:
Imprime el resultado:
fuente
Mi función para descartar valores atípicos
fuente
Prefiero recortar en lugar de soltar. lo siguiente se enganchará en el lugar en el segundo y 98º pecentiles
fuente
Suprimir y descartar valores atípicos, creo que está mal estadísticamente. Hace que los datos sean diferentes de los datos originales. También hace que los datos tengan una forma desigual y, por lo tanto, la mejor manera es reducir o evitar el efecto de los valores atípicos mediante la transformación logarítmica de los datos. Esto funcionó para mí:
fuente