2016-03-31 6 views
5

Ho cercato di lavorare su questo problema per un po '. Sto cercando di rimuovere i caratteri non ASCII dalla colonna DB_user e provando a sostituirli con spazi. Ma continuo ad avere degli errori. Ecco come il mio frame di dati appare:Rimozione di caratteri non ASCII e sostituzione con spazi dal riquadro dati di Pandas

 

+----------------------------------------------------------- 
|  DB_user       source count |            
+----------------------------------------------------------- 
| ???/"Ò|Z?)?]??C %??J      A  10 |          
| ?D$ZGU ;@D??_???T(?)     B   3 |          
| ?Q`H??M'?Y??KTK$?ً???ЩJL4??*?_??  C   2 |           
+----------------------------------------------------------- 

stavo usando questa funzione, che mi ero imbattuto, mentre la ricerca il problema su SO.

def filter_func(string): 
    for i in range(0,len(string)): 


     if (ord(string[i])< 32 or ord(string[i])>126 
      break 

     return '' 

And then using the apply function: 

df['DB_user'] = df.apply(filter_func,axis=1) 

continuo a ricevere l'errore:

 

'ord() expected a character, but string of length 66 found', u'occurred at index 2' 

Tuttavia, ho pensato utilizzando il ciclo nella funzione filter_func, avevo a che fare con questo inputing un char in 'ord'. Quindi nel momento in cui colpisce un carattere non ASCII, dovrebbe essere sostituito da uno spazio.

Qualcuno potrebbe aiutarmi?

Grazie!

risposta

2

codice Si riesce in quanto non stanno applicando su ogni personaggio, si sta applicando per errori di parola e ord come ci vuole un singolo carattere, si avrebbe bisogno:

df['DB_user'] = df["DB_user"].apply(lambda x: ''.join([" " if ord(i) < 32 or ord(i) > 126 else i for i in x])) 

È inoltre possibile semplificare il join utilizzando un paragone incatenato:

''.join([i if 32 < ord(i) < 126 else " " for i in x]) 

Si potrebbe inoltre utilizzare string.printable per filtrare i caratteri:

from string import printable 
st = set(printable) 
df["DB_user"] = df["DB_user"].apply(lambda x: ''.join([" " if i not in st else i for i in x])) 

Il più veloce è quello di utilizzare tradurre:

from string import maketrans 

del_chars = " ".join(chr(i) for i in range(32) + range(127, 256)) 
trans = maketrans(t, " "*len(del_chars)) 

df['DB_user'] = df["DB_user"].apply(lambda s: s.translate(trans)) 

È interessante notare che è più veloce di:

df['DB_user'] = df["DB_user"].str.translate(trans) 
+0

@red_devil, nessun problema, ci sono molti modi diversi per farlo, ma sapere dove hai sbagliato è importante. –

11

si può provare questo:

df.DB_user.replace({r'[^\x00-\x7F]+':''}, regex=True, inplace=True) 
+1

grande risposta, questo può essere utilizzato anche per l'intero DataFrame. – pshep123

+0

@ pshep123, grazie! Sì, può essere facilmente applicato a tutto il DF ... – MaxU

Problemi correlati