2015-10-09 16 views
6

में प्रत्येक पंक्ति के लिए विराम चिह्न हटाएं, मैं अजगर के लिए नया हूं इसलिए यह एक बहुत ही बुनियादी सवाल हो सकता है। मैं एक पांडा डेटाफ्रेम में प्रत्येक पंक्ति के लिए विराम चिह्न को हटाने के लिए लैम्ब्डा का उपयोग करने की कोशिश कर रहा हूं। मैंने निम्नलिखित का उपयोग किया, लेकिन एक त्रुटि प्राप्त हुई। मैं डीएफ को एक सूची में बदलने से बचने की कोशिश कर रहा हूं, फिर साफ किए गए परिणामों को नई सूची में जोड़ूं, फिर इसे वापस एक डीएफ में परिवर्तित करें।पांडा डेटा फ्रेम

किसी भी सुझाव की सराहना की जाएगी!

import string 

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

उत्तर

11

आप string.punctuation खत्म नहीं हुआ, dataframe में स्ट्रिंग से अधिक पुनरावृति करने की जरूरत है। आपको .join() का उपयोग करके स्ट्रिंग बैक अप बनाने की भी आवश्यकता है।

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

जब लैम्ब्डा अभिव्यक्ति लंबे समय तक मिलती है तो यह फ़ंक्शन परिभाषा को अलग से लिखने के लिए अधिक पठनीय हो सकती है, उदा। (धन्यवाद अनुकूलन युक्तियों के लिए @AndyHayden के लिए):

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

बहुत अच्छा! धन्यवाद! – RJL

+0

आपका बहुत स्वागत है! – bernie

+0

यदि यह आपके लिए काम करता है तो आप यह उत्तर स्वीकार कर सकते हैं। –

4

एक regex का उपयोग सबसे अधिक संभावना तेजी से यहां हो जाएगा:

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

यह स्वीकार्य उत्तर होना चाहिए ... – clg4

+1

इसी तरह: 's.str.replace ('[{}]' प्रारूप (string.punctuation), '')' –

संबंधित मुद्दे