J'ai un cadre de données pandas avec quelques colonnes.
Maintenant, je sais que certaines lignes sont des valeurs aberrantes basées sur une certaine valeur de colonne.
Par exemple
la colonne 'Vol' a toutes les valeurs autour
12xx
et une valeur est4000
(aberrante).
Maintenant, je voudrais exclure les lignes qui ont une Vol
colonne comme celle-ci.
Donc, essentiellement, je dois mettre un filtre sur le bloc de données de telle sorte que nous sélectionnons toutes les lignes où les valeurs d'une certaine colonne sont à l'intérieur, disons, de 3 écarts-types de la moyenne.
Quelle est une manière élégante d'y parvenir?
Utilisez l'
boolean
indexation comme vous le feriez dansnumpy.array
Pour une série, c'est similaire:
la source
DataFrame.abs()
FYI, aussiDataFrame.clip()
clip()
Jeff, les contours ne sont pas supprimés:df.SOME_DATA.clip(-3std,+3std)
affectez les contours à + 3std ou -3stddf_new = df[np.abs(df - df.mean()) <= (3 * df.std())]
. Mais contrairement à l'appliquer à une série ou à une seule colonne, cela remplacera les valeurs aberrantes avecnp.nan
et conservera la forme du DataFrame, donc une interpolation peut être nécessaire pour remplir les valeurs manquantes.Pour chacune de vos colonnes de trame de données, vous pouvez obtenir un quantile avec:
puis filtrer avec:
Si vous devez supprimer les valeurs aberrantes inférieures et supérieures, combinez la condition avec une instruction AND:
la source
Cette réponse est similaire à celle fournie par @tanemaki, mais utilise une
lambda
expression à la place descipy stats
.Pour filtrer le DataFrame où UNE seule colonne (par exemple «B») se trouve dans les trois écarts-types:
Voir ici pour savoir comment appliquer ce z-score sur une base continue: Rolling Z-score appliqué aux pandas dataframe
la source
la source
Pour chaque série de la trame de données, vous pouvez utiliser
between
etquantile
pour supprimer les valeurs aberrantes.la source
Depuis que je n'ai pas vu de réponse qui traite de numérique et non numérique attributs , voici une réponse complémentaire.
Vous souhaiterez peut-être supprimer les valeurs aberrantes uniquement sur les attributs numériques (les variables catégorielles peuvent difficilement être des valeurs aberrantes).
Définition de fonction
J'ai étendu la suggestion de @ tanemaki pour gérer les données lorsque des attributs non numériques sont également présents:
Usage
Exemple
Imaginez un ensemble
df
de données avec quelques valeurs sur les maisons: ruelle, contour du terrain, prix de vente, ... Par exemple: Documentation des donnéesTout d'abord, vous souhaitez visualiser les données sur un graphique à nuages de points (avec z-score Thresh = 3):
la source
reduce=False
est obsolète depuis lapandas
version 0.23.0result_type='reduce'
parreduce=False
.scipy.stats
a des méthodestrim1()
ettrimboth()
de couper les valeurs aberrantes sur une seule ligne, selon le classement et un pourcentage introduit de valeurs supprimées.la source
trimboth
était plus facile pour moi.Une autre option consiste à transformer vos données afin d'atténuer l'effet des valeurs aberrantes. Vous pouvez le faire en gagnantorisant vos données.
la source
Si vous aimez le chaînage de méthodes, vous pouvez obtenir votre condition booléenne pour toutes les colonnes numériques comme ceci:
Chaque valeur de chaque colonne sera convertie en
True/False
fonction de si elle est inférieure ou non à trois écarts-types de la moyenne.la source
le(3)
depuis sa suppression des valeurs aberrantes. De cette façon, vous obtenezTrue
pour les valeurs aberrantes. En plus de ce +1 et cette réponse devrait être plus élevéeVous pouvez utiliser un masque booléen:
production:
la source
Comme je suis à un stade très précoce de mon parcours en science des données, je traite les valeurs aberrantes avec le code ci-dessous.
la source
Obtenez le 98e et le 2e centile comme limites de nos valeurs aberrantes
la source
un exemple complet avec des données et 2 groupes suit:
Importations:
Exemple de données avec 2 groupes: G1: Groupe 1. G2: Groupe 2:
Lire les données texte dans le cadre de données pandas:
Définir les valeurs aberrantes à l'aide des écarts-types
Définissez les valeurs de données filtrées et les valeurs aberrantes:
Imprimez le résultat:
la source
Ma fonction pour supprimer les valeurs aberrantes
la source
Je préfère couper plutôt que laisser tomber. les éléments suivants seront clipsés aux 2e et 98e pécentiles.
la source
Supprimer et supprimer les valeurs aberrantes, je crois, est erroné statistiquement. Cela rend les données différentes des données d'origine. Rend également les données de forme inégale et, par conséquent, la meilleure façon est de réduire ou d'éviter l'effet des valeurs aberrantes en transformant les données en journal. Cela a fonctionné pour moi:
la source