1
votes

Remplacement des points d'interrogation par np.nan

J'essaie de remplacer les points d'interrogation dans mon ensemble de données par np.nan:

J'ai essayé d'utiliser le code suivant:

df['Workclass'] = df['Workclass'].replace(to_replace =['?'], value = np.nan, regex = True)

Et ceci: p >

df['Workclass'] = df['Workclass'].map(lambda x: np.nan if x=="?"  else x)

Et ceci:

df['Workclass'] = [row if row!='?' else np.nan for row in df['Workclass']]

Mais aucune de ces solutions ne semble changer la fréquence des points d'interrogation dans la colonne. p >

 entrez la description de l'image ici


3 commentaires

Murtaza, essayez peut-être ceci au cas où il y aurait un espace ou quelque chose de plus dans les colonnes avec ce '?': Df ['Workclass']. Apply (lambda x: np.nan if str (x) .find ('?')> -1 else x) Il semble qu'il y ait peut-être un problème de données


Pouvez-vous tester df ['Workclass'] = df ['Workclass']. Str.strip (). Map (lambda x: np.nan if x == "?" Else x) ?


donc ma solution ci-dessus fonctionne?


3 Réponses :


2
votes

Essayez ceci:

df['Workclass'].apply(lambda x: np.nan if str(x).find('?')>-1 else x)

et si cela fonctionne:

df['Workclass'] = df['Workclass'].apply(lambda x: np.nan if x == '?' else x) 

si vous recherchez "?" n'importe où dans une chaîne, vous pouvez utiliser ceci:

df['Workclass'].apply(lambda x: np.nan if x == '?' else x) 


1 commentaires

@jezrael comment ça ne marche pas, je l'ai testé avant de répondre.



2
votes

Je pense qu'il y a un problème lié aux données, car chacune de vos solutions devrait fonctionner correctement.

Vous pouvez donc tester l'apparence des données avec ? dans la colonne Workclass :

df['Workclass'] = df['Workclass'].mask(df['Workclass'].str.strip() == "?")

Ou si numérique avec des chaînes:

df['Workclass'] = df['Workclass'].str.strip().map(lambda x: np.nan if x=="?" else x)

Le problème devrait être quelques espaces, vous pouvez essayer:

print (df.loc[df['Workclass'].astype(str).str.contains('?', regex=False),
              'Workclass'].tolist())

Ou mieux:

print (df.loc[df['Workclass'].str.contains('?', regex=False), 'Workclass'].tolist())


0 commentaires

1
votes

Il existe une approche plus directe:

df.replace('?',np.NaN)


0 commentaires