2017-06-10 1 views
2

J'ai une trame de données (en Python) comme suit:Comment remplacer les tirets dans une base de données python par NaN?

 A  B C D  E  F  G H 

0 T-1 2 3 - M-7  2   2 

1 T-2 5 4 2 M-7  4   3 

2 T-3 - - 3 M-7   9 4 

3 T-4 6 - 4 M-7  -  9 5 

4 T-5 - 1 5 M-7  8   6 

Je voudrais remplacer les tirets (exclusion ceux de la colonne A et E) avec NaN.

J'ai essayé df.replace('-', np.nan). Il a fini par remplacer les cellules entières des colonnes A et E ainsi. Je suppose que je peux utiliser df[column_name].replace('-',np.nan) mais je devrais l'appliquer pour chaque colonne séparément.

Y a-t-il un autre moyen, qui est efficace et fonctionnera pour n'importe quel nombre de colonnes avec des restrictions similaires?

+2

'df.replace ('-', np.nan)' devrait fonctionner. Je ne sais pas pourquoi cela ne fonctionne pas pour vous. –

+1

Comme je l'ai mentionné dans la question, 'df.replace ('-', np.nan)' fonctionne plus que nécessaire. J'aimerais que les colonnes A et E restent telles quelles, mais les tirets des autres colonnes devraient être remplacés. – dravid07

+1

L'utilisation de 'df.replace ('-', np.nan)' ne devrait rien changer dans les colonnes A et E. Il ne devrait remplacer que les tirets dans les autres colonnes. Il devrait faire exactement ce que vous voulez, donc je ne comprends pas pourquoi cela ne fonctionne pas pour vous. Je ne peux pas reproduire ce problème. –

Répondre

1

Cela devrait fonctionner.

df = pd.DataFrame({'A': list('abcde'), 
        'B': ['T-1', 'T-2', 'T-3', 'T-4', 'T-5'], 
        'C': ['a', '-', 'c', 'd', '-'], 
        'D': ['-', 'b', 'c', 'd', 'e'], 
        'E': ['M-7', 'M-7', 'M-7', 'M-7', 'M-7'], 
        'F': ['a', '-', 'c', '-', '-'], 
        'G': ['a', 'b', 'c', 'd', '-'], 
        'H': ['a', 'b', '-', 'd', '-'] 
        }) 

df = df.astype(str) 

s = df.applymap(lambda x: re.sub(r'^-$', str(np.NaN), x)) 

Sortie:

A B C D E F G H 
0 a T-1 a nan M-7 a a a 
1 b T-2 nan b M-7 nan b b 
2 c T-3 c c M-7 c c nan 
3 d T-4 d d M-7 nan d d 
4 e T-5 nan e M-7 nan nan nan 
+0

Votre méthode est géniale. Mais pour la base de données que * j'ai donnée ci-dessus *, j'obtiens une erreur: 'TypeError: ('chaîne attendue ou objet semblable à un octet', 's'est produit à l'index B')'. – dravid07

+0

Convertissez toutes les colonnes de votre dataframe en type de chaîne et cela fonctionnera pour vous, comme ceci: df.astype (str) –

0
In [18]: df[df.columns.drop(['A','E'])] = \ 
      df[df.columns.drop(['A','E'])].replace('-', np.nan) 

In [19]: df 
Out[19]: 
    A B C D E F G H 
0 a T-1 a NaN M-7 a a a 
1 b T-2 NaN b M-7 NaN b b 
2 c T-3 c c M-7 c c NaN 
3 d T-4 d d M-7 NaN d d 
4 e T-5 NaN e M-7 NaN NaN NaN