2025, Nov 01 07:01
Polars से Excel निर्यात: राउंडिंग, हजारों विभाजक और सही फ़ॉर्मैटिंग
Polars से Excel निर्यात में अतिरिक्त शून्य और हजारों विभाजक रोकें: float_precision व dtype_formats सेट करें या pandas.to_excel/CSV अपनाएँ—व्यावहारिक कदम और फ़ॉर्मैटिंग टिप्स.
Polars से Excel में संख्यात्मक डेटा निर्यात करना अक्सर आसान लगता है, जब तक कि फ़ॉर्मैटिंग अड़चन न बने। एक आम स्थिति यह होती है कि Python में दो दशमलव तक गोल किए गए Float64 मान Excel में जाकर एक अतिरिक्त शून्य के साथ दिखने लगते हैं, और जिन Int64 या Float64 कॉलमों में हजारों का विभाजक नहीं था, वे शीट में अचानक उसे दिखाने लगते हैं। मूल मान ठीक रहते हैं; अंतर केवल इस बात में है कि Excel उन्हें कैसे प्रदर्शित करता है।
पुनरुत्पादन उदाहरण
नीचे दिया गया पाइपलाइन मिश्रित dtypes वाले Excel फ़ाइल को पढ़ता है, समूहित योग निकालता है, सभी Float64 कॉलम को दो दशमलव तक राउंड करता है, असंगतियों को फ़्लैग करता है, और परिणाम को .xlsx में लिख देता है। तर्क सही है, फिर भी आउटपुट शीट में अनचाहा अंतिम शून्य दिख सकता है और हजारों का विभाजक आ सकता है।
import polars as pl
import polars.selectors as sx
sheet = pl.read_excel('../Documents/abc.xlsx', engine='openpyxl')
sheet = sheet.with_columns(
sum_per_group=pl.col('Amount').sum().over('ID').sort_by('ID')
)
sheet = sheet.with_columns(
sx.by_dtype(pl.Float64).round(2)
)
sheet = sheet.with_columns([
pl.when(pl.col('sum_per_group') != pl.col('Total Amount'))
.then(pl.lit('No'))
.otherwise(pl.lit('Yes'))
.alias('Flag')
])
sheet.write_excel('abc_v2.xlsx')
असल में गड़बड़ी कहाँ है
यहाँ दो अलग-अलग मुद्दे हैं। पहला, Excel की सेल सामग्री और उसका प्रस्तुतिकरण अलग चीज़ें हैं। Polars संख्याएँ लिखता है; Excel उन्हें नंबर फ़ॉर्मैट के आधार पर दिखाने का तरीका तय करता है। यदि आप सेल का फ़ॉर्मैट स्पष्ट रूप से सेट नहीं करते, तो Excel कोई ऐसा फ़ॉर्मैट चुन सकता है जो आपकी अपेक्षा से मेल न खाए। यही अतिरिक्त अंतिम शून्य और अनपेक्षित हजारों विभाजक दोनों की वजह समझाता है।
दूसरा, Excel के डिफ़ॉल्ट वही नहीं होते जो आप अपनी Python कंसोल में देखते हैं। Excel टाइप करते ही किसी संख्या पर स्वतः हजारों का विभाजक नहीं लगाता, और दशमलव अंकों की प्रदर्शित संख्या अक्सर कॉलम चौड़ाई और उस सेल फ़ॉर्मैट पर निर्भर करती है जिसे Excel चुन लेता है। जब शीट में हजारों विभाजक या अतिरिक्त शून्य दिखाई देता है, तो वह फ़ॉर्मैटिंग है, मूल मानों में बदलाव नहीं।
एक और बारीकी यह है कि संख्या और टेक्स्ट अलग होते हैं। यदि पाइपलाइन के किसी चरण में Excel को संख्या के बजाय टेक्स्ट मिले, तो Excel उस मान को नंबर फ़ॉर्मैट से नियंत्रित नहीं कर पाएगा। यदि राउंडिंग के ठीक बाद हजारों विभाजक दिखने लगे, तो इसे संकेत मानें कि आउटपुट संख्या ही बना है या टेक्स्ट तो नहीं हो गया—इसे जाँचें।
आज के लिए काम करने वाले व्यावहारिक उपाय
अतिरिक्त अंतिम शून्य की समस्या के लिए, वर्कबुक लिखते समय सीधे निर्यात-परिशुद्धता नियंत्रित करें। सीधा तरीका है कि निर्यात पर float_precision सेट करें। इससे Float64 कॉलम दो दशमलव तक रहते हैं और अनचाहे अंक नहीं जुड़ते।
# ऊपर वाला ही पाइपलाइन रखें, फिर निर्दिष्ट परिशुद्धता के साथ एक्सपोर्ट करें
sheet.write_excel('abc_v2.xlsx', float_precision=2)
हजारों विभाजक के मामले में, फिलहाल सबसे भरोसेमंद रास्ता है कि जब शीट पर सटीक फ़ॉर्मैटिंग चाहिए हो तो Polars का Excel writer न इस्तेमाल करें। इसके बजाय pandas.to_excel लें या Polars से CSV में निर्यात करें। वर्तमान दिशानिर्देशों के अनुसार, polars.write_excel में प्रयुक्त डिफ़ॉल्ट xlsxwriter इंजन अभी पूरी तरह परिपक्व नहीं है, इसलिए यदि बिना विभाजक वाला साफ़-सुथरा संख्यात्मक लेआउट चाहिए, तो pandas.to_excel या polars.write_csv व्यावहारिक विकल्प हैं।
# जब Excel में पूर्वानुमेय रेंडरिंग चाहिए हो तो वैकल्पिक रास्ता
# 1) Polars से सीधे CSV लिखें
sheet.write_csv('abc_v2.csv')
यदि आप Polars के Excel निर्यात के साथ ही रहते हैं, तो उसके लिए दिए गए आर्ग्युमेंट्स से फ़ॉर्मैटिंग नियंत्रित करें। खासकर, polars.DataFrame.write_excel में float_precision और dtype_formats पर ध्यान दें। यह मैपिंग हर dtype के लिए Excel नंबर फ़ॉर्मैट तय करने देती है, जिससे दशमलव अंकों और विभाजकों—दोनों—का नियंत्रण रहता है। संख्याओं के दिखने का तरीका नियंत्रित करने के लिए एक सुझाव यह है कि Int64 और Float64 को किसी स्पष्ट Excel नंबर फ़ॉर्मैट स्ट्रिंग पर मैप करें।
# dtype के आधार पर Excel फ़ॉर्मैट नियंत्रित करने का उदाहरण
# ऐसा फ़ॉर्मैट स्ट्रिंग चुनें जो नंबरों को आपकी अपेक्षित तरह दिखाए
# और हजारों का विभाजक जोड़ने से बचे।
sheet.write_excel(
'abc_v2.xlsx',
float_precision=2,
dtype_formats={
pl.Int64: '0',
pl.Float64: '0'
}
)
इससे संख्यात्मक सामग्री संख्या ही रहती है और Excel उसे आपकी बताई हुई शैली में दिखाता है, शीट के डिफ़ॉल्ट्स के बजाय। यदि दो दृश्यमान दशमलव चाहिए, तो Float64 का फ़ॉर्मैट उसी अनुसार सेट करें ताकि वही प्रदर्शित हो जो आप चाहते हैं, और अवांछित अंकों से बचने के लिए float_precision का उपयोग जारी रखें।
यह क्यों मायने रखता है
डेटा पाइपलाइन का मूल्यांकन अक्सर अंतिम पड़ाव पर होता है—उस स्प्रेडशीट पर जिसे हितधारक खोलते हैं। यदि संख्याओं का रूप Python के दृश्य से भटक जाए, तो गलत अर्थ निकालने, वैलिडेशन में उलझने और फिर से काम करने का जोखिम बन जाता है। कच्चे मानों को प्रदर्शन से अलग मानते हुए फ़ॉर्मैटिंग को स्पष्ट करना निर्यात को अलग-अलग वातावरणों में भी पूर्वानुमेय और दोहराने योग्य बनाता है।
मुख्य बातें
Excel के रेंडरिंग को फ़ॉर्मैटिंग का विषय मानें और निर्यात के समय उसे स्पष्ट रूप से सेट करें। Polars में float_precision से अंतिम अंकों पर नियंत्रण रखें। जब शीट पर हजारों का विभाजक नहीं चाहिए हो या सख्त डिस्प्ले मानक का पालन करना हो, तो dtype_formats के ज़रिए नंबर फ़ॉर्मैट अपनाएँ या, फिलहाल अधिक सहज रास्ते के लिए, pandas.to_excel लें या polars.write_csv से CSV पर जाएँ। यह भी सुनिश्चित करें कि पाइपलाइन फ़ाइल तक पहुँचते-पहुँचते dtypes को संख्यात्मक ही बनाए रखे—खासकर उन चरणों में जहाँ संख्याएँ गलती से टेक्स्ट में बदल सकती हैं। इन बातों पर पहले से निर्णय लेने से वही फ़ाइल खुलेगी जिसकी आपके उपयोगकर्ताओं को उम्मीद है—बिना अंतिम समय की आश्चर्यों के।