2025, Oct 30 23:32
pandas में Series.str.replace और regex=True से टेक्स्ट क्लीनिंग
pandas में Series.str.replace का regex=True उपयोग समझें: non‑alphanumeric हटाएँ, जरूरी स्पेस/नॉन‑ASCII बचाएँ. उदाहरण कोड से तेज़ टेक्स्ट क्लीनिंग सीखें.
pandas में पाठ-डेटा की सफाई अक्सर विराम-चिह्न और प्रतीक हटाने से शुरू होती है। एक आम अड़चन यह होती है कि Series.str.replace को रेगुलर एक्सप्रेशन तो दे दिया जाता है, पर regex मोड सक्षम नहीं किया जाता। नतीजा उलझाने वाला होता है — कुछ भी नहीं बदलता — जबकि पैटर्न देखने में सही लगता है।
समस्या को दोहराना
नीचे दिया गया स्निपेट 911.csv से लोड किए गए desc कॉलम से सभी गैर-अक्षरांकीय (non‑alphanumeric) वर्ण हटाने की कोशिश करता है।
import pandas as pd
calls_df = pd.read_csv('911.csv')
calls_df['desc'].str.replace('[^a-zA-Z0-9]', '').head()अक्षरों और अंकों के अलावा सब कुछ मैच करने वाली कैरेक्टर क्लास के बावजूद, कॉलम की सामग्री जस की तस रहती है।
यह हो क्या रहा है
Series.str.replace अपना पहला आर्ग्युमेंट या तो लिटरल स्ट्रिंग की तरह या रेगुलर एक्सप्रेशन की तरह ले सकता है। जब regex हैंडलिंग सक्षम नहीं होती, तो इंजन स्क्वायर ब्रैकेट, कैरेट और रेंज जैसे विशेष चिन्हों को पैटर्न की तरह नहीं समझता। व्यावहारिक तौर पर इसका अर्थ है कि रिप्लेसमेंट वह हिस्सा कभी मैच ही नहीं करता जिसकी आप उम्मीद करते हैं, इसलिए टेक्स्ट बदलता नहीं।
समाधान
regex मोड को स्पष्ट रूप से सक्षम करें। इतना भर करने से कैरेक्टर क्लास इच्छित रूप से काम करेगी। विवरण के लिए pandas की Series.str.replace डॉक्यूमेंटेशन देखें।
calls_df['desc'].str.replace('[^a-zA-Z0-9]', '', regex=True).head()एक और बारीकी: यह पैटर्न शब्दों के बीच की स्पेस भी हटा देता है। यदि आप स्पेस रखना चाहते हैं, तो कैरेक्टर क्लास में अनुमत सेट में स्पेस भी जोड़ दें।
calls_df['desc'].str.replace('[^a-zA-Z0-9 ]', '', regex=True).head()नॉन‑ASCII वर्णमाला के अक्षर
पैटर्न [^a-zA-Z0-9] ASCII रेंज के बाहर आने वाले अक्षरों को भी हटा देता है। उदाहरण के लिए, यह Düsseldorf को Dsseldorf बना देगा। यदि आपको नॉन‑ASCII अक्षर सुरक्षित रखने हैं, तो a-zA-Z की जगह \w का उपयोग करने पर विचार करें।
calls_df['desc'].str.replace(r'[^\w]', '', regex=True).head()और यदि नॉन‑ASCII अक्षरों के साथ स्पेस भी बचानी हो, तो नकारात्मक क्लास में स्पेस को भी अनुमति दें।
calls_df['desc'].str.replace(r'[^\w ]', '', regex=True).head()यह क्यों महत्वपूर्ण है
टेक्स्ट नॉर्मलाइज़ेशन आगे की एनालिटिक्स, सर्च और मैचिंग की बुनियाद है। लिटरल और regex मोड के बीच का शांत सा मिसमैच सफाई के चरण को चुपचाप पटरी से उतार सकता है, जिससे फीचर एक्सट्रैक्शन या एग्रीगेशन के लिए इनपुट असंगत हो जाते हैं। उतना ही अहम है कि आप क्या बचा रहे हैं: स्पेस हटाने से टोकन की सीमाएँ बदल जाती हैं, और नॉन‑ASCII अक्षर हटाने से नाम और स्थान विकृत हो सकते हैं।
मुख्य बातें
pandas में पैटर्न के साथ स्ट्रिंग रिप्लेसमेंट करते समय regex=True सक्षम रखें। साफ-सफाई के बाद स्पेस बचनी चाहिए या नहीं — यह स्पष्ट रूप से तय करें और उसी के अनुसार कैरेक्टर क्लास समायोजित करें। यदि आपके डेटा में नॉन‑ASCII पाठ शामिल है, तो उन अक्षरों को बनाए रखने के लिए \w को तरजीह दें। ऐसी छोटी, सोची-समझी पसंदें आपके प्रीप्रोसेसिंग को अनुमानित रखती हैं और नतीजों पर भरोसा बनाए रखती हैं।
यह लेख StackOverflow पर एक प्रश्न, जिसे david yen2 ने पूछा था, और furas के उत्तर पर आधारित है।