2017-08-07 8 views
0

J'ai deux dataframes que j'ai créées en utilisant des pandas. Si vous regardez le graphique ci-dessous, vous pouvez voir que mes deux trames de données suivent à peu près le même modèle de données. Je veux que les pandas me disent quand mes données tombent en dehors d'un certain paramètre. Par exemple: disons que je voulais savoir quand sur l'axe des x les données sont inférieures à 2 ou supérieures à 4 sur l'axe des ordonnées. Je sais que je peux obtenir des pandas pour éliminer les valeurs aberrantes en utilisant une courbe d'écart-type et je suis également capable d'imprimer les valeurs aberrantes dans un fichier Excel. Mais cela ne fonctionnera pas pour ces données, je ne veux pas supprimer les données que je veux juste savoir où sont toutes les valeurs aberrantes. J'ai essayé de créer un index booléen comme ceci df4[(df4 < 2) | (df4 > 4)] mais cela efface simplement les valeurs de données inférieures à 2 et supérieures 4. Ma question est la suivante: Comment puis-je configurer mon propre paramètre pour déterminer les valeurs aberrantes en utilisant des pandas sans supprimer les données?Créer un paramètre personnalisé pour trouver des valeurs aberrantes dans la zone de données pandas

import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt 
import seaborn 
plt.style.use("dark_background") 
plt.style.use("seaborn-bright") 



x4 = (e[0].time[:47172]) 
y4 = (e[0].data.f[:47172]) 

x6 = (t[0].time[:47211]) 
y6 = (t[0].data.f[:47211]) 

df4 = pd.DataFrame({'Time': x4, 'Data': y4}) 
df6 = pd.DataFrame({'Time': x6, 'Data': y6}) 
plt.xlabel('Relative Time in Seconds', fontsize=12) 
plt.ylabel('Data', fontsize=12) 
plt.grid(linestyle = 'dashed') 

plt.plot(x4, y4) 
plt.plot(x6, y6) 
plt.show() 

enter image description here

Répondre

0

Vous vraiment fait déjà. Lorsque vous faites df4[(df4 < 2) | (df4 > 4)] il ne "efface" pas les données, il ne montre que les enregistrements qui satisfont les critères, en d'autres termes vous ne voyez que le sous-ensemble de la trame de données. Si vous voulez voir l'ensemble dataframe vous pouvez simplement ajouter une nouvelle colonne:

df['outlier'] = (df4['Data'] < 2) | (df4['Data'] > 4) 

Ensuite, vous pouvez voir l'ensemble dataframe simplement df et la colonne outlier sera True pour les valeurs aberrantes. Si vous voulez regarder seulement les valeurs aberrantes: df[df.outlier] ou non-aberrantes: df[~df.outlier]. De même, vous pouvez même coder en couleur les valeurs aberrantes sur votre graphique en utilisant une colonne aberrante comme indication de la couleur.

+0

Lorsque je tape 'df4 ['outlier'] = (df4 <2) | (df4> 4) 'après' df4 = pd.DataFrame ({'Time': x4, 'Data': y4}) 'J'obtiens une erreur: ValueError: Mauvais nombre d'éléments passés 2, le placement implique 1 –

+0

Bien sûr. Vous devez spécifier quelle colonne doit être utilisée dans la comparaison logique. Donc, si vous voulez qu'il soit basé sur "Data" alors il devrait être '(df4 [" Data "] <2) | (df4 ["Data"]> 4) ' – omdv

+0

Cela fonctionne maintenant! Votre dernière phrase m'intéresse cependant. Je n'avais même pas envisagé de les mettre en évidence sur le graphique. Comment puis-je utiliser la colonne aberrante comme indicateur de couleur? –