2015-10-09 12 views
6

Jestem nowy dla Pythona, więc może to być bardzo podstawowe pytanie. Próbuję użyć lambda do usunięcia interpunkcji dla każdego wiersza w ramce danych pandy. Użyłem następujących, ale otrzymałem błąd. Próbuję uniknąć przekonwertowania pliku df na listę, a następnie dołączyć oczyszczone wyniki do nowej listy, a następnie przekonwertować ją z powrotem na df.usunąć interpunkcję dla każdego wiersza w ramce danych pandy

Wszelkie sugestie będą mile widziane!

import string 

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

Odpowiedz

11

trzeba iteracyjne nad ciąg w dataframe, nie nad string.punctuation. Musisz również utworzyć ciąg kopii zapasowej za pomocą .join().

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

Gdy wyrażenia lambda są tak długie, łatwiej jest napisać definicję funkcji oddzielnie, np. (Dzięki @AndyHayden za wskazówki optymalizacyjne):

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

bardzo miło! Dzięki! – RJL

+0

Serdecznie witamy! – bernie

+0

Możesz zaakceptować tę odpowiedź, jeśli zadziała. –

4

Korzystanie regex najprawdopodobniej będzie szybciej tutaj:

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

to powinna być zaakceptowana odpowiedź ... – clg4

+1

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

Powiązane problemy