2015-10-09 13 views
6

Sono nuovo in Python, quindi questa potrebbe essere una domanda molto semplice. Sto cercando di usare lambda per rimuovere la punteggiatura per ogni riga in un dataframe panda. Ho usato quanto segue, ma ho ricevuto un errore. Sto cercando di evitare di convertire il df in un elenco, quindi aggiungere i risultati puliti in un nuovo elenco, quindi convertirlo nuovamente in un df.rimuovere la punteggiatura per ogni riga in un frame di dati panda

Qualsiasi suggerimento sarebbe apprezzato!

import string 

df['cleaned'] = df['old'].apply(lambda x: x.replace(c,'') for c in string.punctuation) 

risposta

11

È necessario iterare la stringa nel dataframe, non sopra string.punctuation. È inoltre necessario creare il backup delle stringhe utilizzando .join().

df['cleaned'] = df['old'].apply(lambda x:''.join([i for i in x 
                if i not in string.punctuation])) 

Quando le espressioni lambda arrivare a lungo come quello che può essere più leggibile per scrivere la definizione della funzione a parte, per esempio (Grazie a @AndyHayden per i suggerimenti per l'ottimizzazione):

def remove_punctuation(s): 
    s = ''.join([i for i in s if i not in frozenset(string.punctuation)]) 
    return s 

df['cleaned'] = df['old'].apply(remove_punctuation) 
+0

Very nice! Grazie! – RJL

+0

Sei il benvenuto! – bernie

+0

Puoi accettare questa risposta se funziona per te. –

4

Usando un'espressione regolare sarà molto probabilmente più veloce qui:

In [11]: RE_PUNCTUATION = '|'.join([re.escape(x) for x in string.punctuation]) # perhaps this is available in the re/regex library? 

In [12]: s = pd.Series(["a..b", "c<=d", "e|}f"]) 

In [13]: s.str.replace(RE_PUNCTUATION, "") 
Out[13]: 
0 ab 
1 cd 
2 ef 
dtype: object 
+1

questa dovrebbe essere la risposta accettata ... – clg4

+1

Analogamente: 's.str.replace ('[{}]'. Format (string.punctuation), '')' –

Problemi correlati