2025, Oct 04 07:31

IMDB title.basics.tsv में runtimeMinutes पार्स त्रुटि: pandas के साथ गैर‑संख्यात्मक टोकन को NA मानकर सुरक्षित लोड

IMDB title.basics.tsv को pandas में लोड करते समय runtimeMinutes में गैर‑संख्यात्मक मानों से होने वाली ValueError को Int64 और na_values से हल करें, तेजी से.

pandas के साथ IMDB की title.basics.tsv फ़ाइल को पार्स करना सीधा लगता है, जब तक कि एक साधारण dtype कास्ट ValueError: Unable to parse string "Reality-TV" के साथ न फट जाए। उलझन यह है कि रिपोर्ट की गई स्थिति कच्ची फ़ाइल में उस पंक्ति के आसपास आपको जो दिखता है, उससे मेल नहीं भी खा सकती। लाइन नंबरों के पीछे भागने के बजाय, बेहतर है कि देखें runtimeMinutes में वास्तव में क्या है और गैर‑संख्यात्मक टोकन को स्पष्ट रूप से संभालें।

विफलता को पुन: उत्पन्न करना

सामान्य इंजेशन चरण में pandas के Int64 के जरिए nullable integer लागू किया जाता है और "\N" को missing माना जाता है। यहीं पर त्रुटि सामने आती है।

import pandas as pd
movie_data = pd.read_csv("title.basics.tsv",
                         sep="\t",
                         dtype={
                             "runtimeMinutes": "Int64",
                         },
                         na_values={
                             "runtimeMinutes": ["\\N"],
                         })

अपवाद ValueError: Unable to parse string "Reality-TV" यह दर्शाता है कि कॉलम में ऐसे मान हैं जो संख्याएँ नहीं हैं और वर्तमान na_values मैपिंग में शामिल नहीं हैं।

वास्तव में त्रुटि का कारण क्या है

runtimeMinutes फ़ील्ड संख्यात्मक होने की अपेक्षा की जाती है, लेकिन व्यवहार में इसमें str मान भी मौजूद हैं। ऐसे टेक्स्ट टोकन read_csv के दौरान Int64 में कास्ट नहीं हो सकते, इसलिए पार्स असफल हो जाता है। व्यावहारिक उपाय यह है कि उन यूनिक मानों को सूचीबद्ध करें जो कास्ट को रोकते हैं और लोड करते समय उन्हें missing मानें।

गैर‑संख्यात्मक टोकन कैसे पहचानें

नीचे दिया स्निपेट runtimeMinutes पर dtype थोपे बिना फ़ाइल पढ़ता है, यूनिक मान स्कैन करता है, और जो भी int() में विफल हो उसे इकट्ठा करता है। यह समस्याग्रस्त मानों को प्रिंट भी करता है ताकि डेटा की दिक्कतें स्पष्ट हों।

import pandas as pd
raw_frame = pd.read_csv("title.basics.tsv",
                        sep="\t",
                        na_values={
                            "runtimeMinutes": ["\\N"],
                        })
def extract_bad_markers(tbl, field_name):
    anomalies = []
    print(f"{'Type':20} | {'Value'}")
    print('-'*53)
    for item in tbl[field_name].unique():
        try:
            int(item)
        except:
            print(f"{str(type(item)):20} | {item}")
            anomalies.append(item)
    print("\nIncorrect values:", anomalies)
    return anomalies
invalid_values = extract_bad_markers(raw_frame, "runtimeMinutes")

runtimeMinutes में "Reality-TV" जैसे स्ट्रिंग्स की मौजूदगी ही parsing त्रुटि को ट्रिगर करती है।

गैर‑संख्यात्मक टोकन को NA मानकर साफ़ तरीके से लोड करना

जब अमान्य मार्करों का सेट मिल जाए, तो read_csv को निर्देश दें कि उन्हें "\N" के साथ missing माने। तब pandas कॉलम को सुरक्षित रूप से Int64 के रूप में लोड कर सकता है।

invalid_values.append("\\N")
clean_titles = pd.read_csv("title.basics.tsv",
                           sep="\t",
                           dtype={
                               "runtimeMinutes": "Int64",
                           },
                           na_values={
                               "runtimeMinutes": invalid_values,
                           })

पहली बार चलाने पर यह तरीका अधिक समय ले सकता है, क्योंकि अंतिम लोड से पहले आप यूनिक मान स्कैन करते हैं। बदले में आपको एक भरोसेमंद इंजेशन चरण मिलता है, जिसे दोबारा उपयोग किया जा सकता है; शुरुआती पास के बाद आप ठीक से प्रोसेस किया DataFrame सहेजकर सीधे उपयोग कर सकते हैं।

अपनी डेटा पाइपलाइन में यह क्यों चाहिए

जब वास्तविक दुनिया के डेटासेट एक ही फ़ील्ड में प्रकार मिला देते हैं, तो स्कीमा से जुड़ी धारणाएँ नाज़ुक साबित होती हैं। सभी गैर‑संख्यात्मक टोकन को स्पष्ट रूप से खोजकर NA घोषित करने से पार्सर निर्धार्य रहता है, nullable integer का अभिप्राय सुरक्षित रहता है, और एरर संदेशों में भ्रामक positions के पीछे भागने से बचते हैं। परिणाम है एक दोहराने योग्य लोड चरण जो कम विफल होता है और उन डेटा‑विशेषताओं का दस्तावेज़ बनाता है जिन्हें आगे संभालना होगा।

सार

जब pandas में dtype कास्टिंग फेल होती है, तो अपेक्षाओं पर निर्भर रहने के बजाय कॉलम के वास्तविक दायरे की जाँच करें। पहले बिना dtype के पढ़ें, यूनिक मान गिनें, और जो कुछ भी int() नहीं बन सकता उसे पकड़ें। उस सेट को na_values में दें और लक्ष्य dtype के साथ दोबारा लोड करें। IMDB की title.basics.tsv के मामले में, यह "\N" सहित अप्रत्याशित स्ट्रिंग्स को missing मानकर runtimeMinutes को एक सही Int64 कॉलम में बदल देता है। साफ़ किया डेटासेट सहेज लें ताकि अगली बार खोज चरण छोड़ सकें और अपनी पाइपलाइन तेज़ और अनुमानित बनी रहे।

यह लेख StackOverflow पर प्रश्न (द्वारा: red_trumpet) और Sindik के उत्तर पर आधारित है।