2017-04-13 1 views
3

Compte tenu de cette trame de données:Pandas Cadre de données Chaîne partielle Remplacer

import pandas as pd 
d=pd.DataFrame({'A':['a','b',99],'B':[1,2,'99'],'C':['abcd99',4,5]}) 
d 

    A B C 
0 a 1 abcd* 
1 b 2 4 
2 99 99 5 

Je veux remplacer toutes les 99s dans la totalité de la trame de données avec des astérisques. J'ai essayé ceci:

d.replace('99','*') 

... mais cela ne fonctionnait dans le cas de la chaîne 99 dans la colonne B.

Merci à l'avance!

Répondre

2

Utilisez les fonctions de caractère de numpy

d.values[:] = np.core.defchararray.replace(d.values.astype(str), '99', '*') 
d 

    A B  C 
0 a 1 abcd* 
1 b 2  4 
2 * *  5 

essai temps naïf

enter image description here

2

Le problème est des valeurs 99 dans la colonne A et B sont de différents types:

>>> type(d.loc[2,"A"]) 
<class 'int'> 
>>> type(d.loc[2,"B"]) 
<class 'str'> 

Vous pouvez lancer votre dataframe type de chaîne via df.astype() puis remplacer, ce qui:

>>> d.astype(str).replace("99","*") 
    A B  C 
0 a 1 abcd99 
1 b 2  4 
2 * *  5 

Editer: utiliser regex est la bonne solution donnée par d'autres réponses. J'ai pour une raison quelconque manqué l'abcd * dans votre DataFrame.

Laisser ceci ici, juste au cas où il serait utile à quelqu'un d'autre.

3

Si vous voulez remplacer tous les 99 s, essayez d'utiliser regex

>>> d.astype(str).replace('99','*',regex=True)

A B C 
0 a 1 abcd* 
1 b 2 4 
2 * * 5 
3

Cela fera le travail:

import pandas as pd 
d=pd.DataFrame({'A':['a','b',99],'B':[1,2,'99'],'C':['abcd99',4,5]}) 
d=d.astype(str) 
d.replace('99','*',regex=True) 

qui donne

A B C 
0 a 1 abcd* 
1 b 2 4 
2 * * 5 

Notez que cela crée une nouvelle image. Vous pouvez aussi le faire à la place inplace:

d.replace('99','*',regex=True,inplace=True)