2015-10-09 23 views
6

ben python için yeni bir pandalar veri çerçeve içinde her satır için noktalamayı kaldırmak. Bir pandalar veri çerçevesinde her satır için noktalama işareti kaldırmak için lambda kullanmaya çalışıyorum. Aşağıdakileri kullandım, ancak bir hata aldı. Df'yi bir listeye dönüştürmekten, temizlenen sonuçları yeni listeye ekledikten sonra bir df'ye dönüştürmekten kaçınmaya çalışıyorum.nedenle bu çok temel bir soru olabilir

herhangi bir öneriniz mutluluk duyacağız!

import string 

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

cevap

11

Sen string.punctuation üzerinde, dataframe içinde dize üzerinde yineleme gerekir. Ayrıca, .join()'u kullanarak dizeyi tekrar oluşturmanız gerekir.

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

lambda ifadeleri olsun uzun, ayrı ayrı, örneğin işlev tanımı yazmak için daha okunabilir olabilir (Teşekkürler optimizasyon ipuçları için @AndyHayden için):

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

Çok güzel! Teşekkürler! – RJL

+0

Çok hoş geldiniz! – bernie

+0

Eğer sizin için çalışıyorsa bu cevabı kabul edebilirsiniz. –

4

büyük olasılıkla daha hızlı burada olacak bir normal ifade kullanma:

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

bu kabul cevap olmalı ... – clg4

+1

Benzer: 's.str.replace (. '[{}]' Biçiminde (string.punctuation), '')' –