2025, Oct 20 19:31
parent पंक्तियों के साथ pandas में forward fill कैसे करें
इस गाइड में जानें कि pandas में parent पंक्तियों के आधार पर value_col को forward fill कैसे करें: non-parent पंक्तियों को NaN बनाकर ffill से तेज, वेक्टराइज़्ड समाधान।
किसी कॉलम में मान को अगले मार्कर‑पंक्ति के आने तक नीचे ले जाना, तालिकीय डेटा की सफाई में एक आम कदम है। pandas में यह फॉरवर्ड फिल जैसा दिखता है, फर्क सिर्फ इतना है कि आप मान तभी आगे बढ़ाना चाहते हैं जब कोई विशेष “parent” शर्त पूरी हो। नीचे बिना धीमे लूप या कस्टम इंडेक्सिंग लॉजिक लिखे यही काम करने का संक्षिप्त तरीका है।
समस्या सेटअप
मान लीजिए आपके पास ऐसी तालिका है, जहाँ कुछ पंक्तियाँ “parent” हैं — इसकी पहचान आख़िरी कॉलम में "String" होने से होती है। उन parent पंक्तियों में तीसरे कॉलम का मान वह संदर्भ है जिसे आप उसी कॉलम में नीचे की पंक्तियों तक कॉपी करना चाहते हैं, जब तक अगली parent पंक्ति न आ जाए। गैर‑parent पंक्तियों में X या Y जैसे प्लेसहोल्डर हो सकते हैं, या ऐसी संख्याएँ जिन्हें आप ओवरराइट करना चाहते हैं।
1   2   3   'String'
''  4   X   ''
''  5   X   ''
''  6   7   'String'
''  1   Y   ''
लक्ष्य यह है कि हर "String" पंक्ति से तीसरे कॉलम को फॉरवर्ड‑फिल किया जाए, ताकि X और Y क्रमशः 3 और 7 बन जाएँ — जब तक अगली "String" पंक्ति संदर्भ को रीसेट न कर दे।
1   2   3   'String'
''  4   3   ''
''  5   3   ''
''  6   7   'String'
''  1   7   ''
न्यूनतम, पुनरुत्पाद्य उदाहरण
नीचे इस व्यवहार का एक संक्षिप्त उदाहरण है। नाम सामान्य रखे गए हैं और ध्यान दो प्रमुख कॉलमों पर है: एक वह जिसमें आगे बढ़ाने वाला मान है, और दूसरा जो parent पंक्तियों को चिह्नित करता है।
import pandas as pd
import numpy as np
frame = pd.DataFrame({
    'k1': [1, '', '', '', ''],
    'k2': [2, 4, 5, 6, 1],
    'value_col': [3, 'X', 'X', 7, 'Y'],
    'label_col': ['String', '', '', 'String', '']
})
print(frame)
यहाँ label_col के "String" होने पर parent पंक्तियाँ दिखती हैं, और लेबल खाली होने पर non‑parent पंक्तियाँ। उद्देश्य है कि अंतिम दिखी parent पंक्ति से value_col को नीचे तक भरा जाए।
सरल तरीका कठिन क्यों लगता है
हर parent खंड के लिए शुरू‑आखिर इंडेक्स निकालकर स्लाइस में मान लिखना संभव है, लेकिन धीमा और झंझटभरा। असल में चाहिए एक वेक्टराइज़्ड ऑपरेशन, जो non‑parent पंक्तियों को missing माने और हाल की वैध प्रविष्टि से आगे भर दे। यही तो forward fill करता है—बशर्ते non‑parent पंक्तियाँ missing के रूप में चिह्नित हों।
फॉरवर्ड फिल के साथ समाधान
कुंजी यह है कि पहले लक्षित कॉलम में non‑parent पंक्तियों को missing मानों में बदल दें, और फिर forward fill लगाएँ। जैसे ही वे प्लेसहोल्डर NaN बनते हैं, pandas अंतिम वैध संख्या को अगले वैध मान मिलने तक नीचे की ओर फैला देता है।
# लक्षित कॉलम में सभी non‑parent पंक्तियों को NaN में बदलें
frame.loc[frame['label_col'] != 'String', 'value_col'] = np.nan
# हाल की parent पंक्ति से आगे की ओर भरें
frame['value_col'] = frame['value_col'].ffill()
print(frame[['value_col', 'label_col']])
नतीजा यह होता है कि हर parent पंक्ति का संदर्भ मान अगली पंक्तियों पर लागू रहता है, जब तक अगली parent पंक्ति न आ जाए। यह तरीका इस पर निर्भर है कि parent पंक्तियों में label_col का मान ठीक‑ठीक "String" हो।
dtypes पर एक टिप्पणी
किसी integer कॉलम में NaN देने पर उसका dtype float हो जाता है। कई स्थितियों में यह ठीक है, क्योंकि float64 9 क्वाड्रिलियन तक के पूर्णांकों को ठीक‑ठीक रख सकता है। यदि आपको सच में integer dtype चाहिए, तो भरने के बाद floats को int में बदल लें।
यह क्यों मायने रखता है
यह पैटर्न लॉग फ़ाइलों, अर्ध‑संरचित एक्सपोर्ट और पदानुक्रम वाली फ्लैट फ़ाइलों में अक्सर मिलता है, जहाँ एक marker पंक्ति आगे की पंक्तियों का संदर्भ तय करती है। non‑parent पंक्तियों को NaN से बदलकर ffill करना स्पष्ट भी है और तेज़ भी—हाथ से इटरेशन और नाज़ुक इंडेक्स गणित से बचाता है। पढ़ने में भी साफ रहता है: अप्रासंगिक मानों को missing मानें और फिर अंतिम ज्ञात सही मान को आगे बढ़ाएँ।
मुख्य बातें
जब आपकी पंक्तियाँ parent‑child शैली में हों, तो non‑parent मानों को missing मानें और forward fill के साथ भारी काम pandas पर छोड़ दें। जब तक आपकी parent शर्त साफ हो, यह दो‑कदम रूपांतरण सीधा, तेज़ और संभालने में आसान रहता है। यदि आपकी पाइपलाइन dtype बदलने पर संवेदनशील है, तो भरने के बाद floats को int में बदलने की योजना रखें।