2017-10-13 9 views
1

J'ai un problème avec une colonne sur une trame de données pandas. En raison d'erreurs de saisie de données, j'ai une colonne avec true et false, mais il contient également environ 71 décimales. J'essaie de me débarrasser des décimales et de les transformer en nan afin que je puisse ignorer ces lignes pour une analyse plus approfondie.Remplacer les nombres par `nan` dans la trame de données pandas

Lorsque je tente:

datafinal['any_misread'] = datafinal['any_misread'].where(datafinal['any_misread'] < 1, np.nan) 

Je reçois l'erreur:

TypeError: unorderable types: str() < int() 

J'ai aussi essayé avec Logiques .replace et sans succès.

Qu'est-ce qui me manque ici?

+0

Vous avez un type de données de jointure? pouvez-vous montrer 'datafinal ['any_misread']. dtypes' – Wen

Répondre

2

Essayons en utilisant where et astype:

df = pd.DataFrame({'col1':[True, False, 0.12, True, False, .3]}) 

df.where((df.col1.astype(str) == 'True') | (df.col1.astype(str) == 'False')) 

Sortie:

col1 
0 True 
1 False 
2 NaN 
3 True 
4 False 
5 NaN 
+0

quoi faire quand j'ai besoin de ne conserver que les valeurs flottantes – pyd

+0

@pyd Vous pouvez utiliser ceci:' df.where ((df.col1.astype (str)! = ' True ') & (df.col1.astype (str)! =' Faux ')) ' –

0

Vous pouvez vérifier si le type de chaque élément de la colonne est pas bool et modifiez la valeur.

df = pd.DataFrame([[True],[True],[False],[10.2],[1.0],[False],[0]], columns=['misread']) 
df.misread[df.misread.apply(lambda x: not isinstance(x, bool))] = pd.np.nan 

df 
# returns 
    misread 
0 True 
1 True 
2 False 
3  NaN 
4  NaN 
5 False 
6  NaN