2025, Sep 27 05:31
pandas में कॉलम-स्तरीय अधिकतमों को sort_values से क्रमबद्ध करें
pandas DataFrame के कॉलम पर max() के बाद बनी Series को मानों के आधार पर अवरोही क्रम में कैसे sort करें। sort_values बनाम sort_index का फर्क और सही कोड उदाहरण.
pandas में संचयी आँकड़ों को क्रमबद्ध करना सीधा हो जाता है, जैसे ही आप इंडेक्स के आधार पर क्रमबद्ध करने और मानों के आधार पर क्रमबद्ध करने में फर्क समझ लेते हैं। एक आम अड़चन तब आती है जब आप स्तंभ-स्तर पर अधिकतम मान निकालते हैं और उन्हें रैंक करना चाहते हैं, लेकिन पता चलता है कि जिसे आप सॉर्ट कर रहे हैं वह Series है, DataFrame नहीं, और सॉर्टिंग कॉल गलत अक्ष (axis) को निशाना बना रही है। नीचे वर्षवार संचयी वर्षा के वास्तविक उदाहरण पर आधारित एक संक्षिप्त मार्गदर्शिका दी गई है।
समस्या का सार
एक बहु-स्तंभ pandas DataFrame है, जहाँ हर स्तंभ एक वर्ष का प्रतिनिधित्व करता है और उसमें क्रमिक दिनों की संचयी वर्षा के मान होते हैं। हर स्तंभ की अंतिम प्रविष्टि उसी स्तंभ का अधिकतम मान है। काम यह है कि हर वर्ष का अधिकतम मान निकालना और इन अधिकतमों को अवरोही क्रम में क्रमबद्ध करना। प्रारम्भिक प्रयास में इंडेक्स के आधार पर सॉर्ट किया गया, जो अपेक्षित क्रम नहीं बदलता; और axis=1 के साथ सॉर्ट करने की कोशिश विफल होती है क्योंकि परिणाम Series होता है।
समस्या को दोहराने वाला कोड उदाहरण
import pandas as pd
import os
rain_df = pd.read_csv('myfile.txt', sep=' ', skipinitialspace=True)
col_max = rain_df.max()
print(col_max)
# यह प्रयास लेबल्स को क्रमबद्ध करता है, न कि संख्यात्मक मानों को
sorted_by_labels = col_max.sort_index()
print(sorted_by_labels)
यह प्रति-स्तंभ अधिकतम मानों की एक Series बनाता है। sort_index के जरिए सॉर्ट करने पर क्रम लेबलों जैसे Avge, 1945, 1946 आदि के आधार पर बदलता है, न कि संख्यात्मक अधिकतमों के आधार पर। axis=1 के साथ सॉर्ट करने की कोशिश करने पर “ValueError: No axis named 1 for object type Series” त्रुटि आती है, जो बताती है कि एक-आयामी Series में चुनने के लिए दूसरा अक्ष होता ही नहीं।
असल में हो क्या रहा है
DataFrame.max() को स्तंभों पर कॉल करने से pandas Series मिलती है: प्रत्येक इंडेक्स लेबल स्तंभ का नाम (जैसे कोई वर्ष) होता है, और प्रत्येक मान उस स्तंभ का अधिकतम। इस Series को इंडेक्स के आधार पर सॉर्ट करने से लेबल पुनर्व्यवस्थित होते हैं, संख्यात्मक अधिकतम नहीं। चूँकि Series एक-आयामी है, इसमें केवल एक अक्ष होता है; axis=1 इस ऑब्जेक्ट के लिए मौजूद ही नहीं, इसलिए वही त्रुटि आती है।
समाधान: मानों के आधार पर अवरोही क्रम में सॉर्ट करें
सबसे बड़े से सबसे छोटे तक अधिकतमों को रैंक करने के लिए Series को उसके मानों के आधार पर सॉर्ट करें। कुंजी है sort_values को ascending=False के साथ कॉल करना।
import pandas as pd
import os
rain_df = pd.read_csv('myfile.txt', sep=' ', skipinitialspace=True)
col_max = rain_df.max()
ranked_max = col_max.sort_values(ascending=False)
print(ranked_max)
यह वर्ष के लेबल और उनकी अधिकतम संचयी वर्षा के बीच का संबद्ध बनाए रखता है, और परिणामों को बड़े से छोटे मान की दिशा में क्रमबद्ध कर देता है।
यह बारीकी क्यों मायने रखती है
जब आप स्तंभों को एग्रीगेट करते हैं, तो आउटपुट का प्रकार तय करता है कि आगे आप क्या कर सकते हैं। Series के साथ, sort_index और sort_values एक ही डेटा के अलग-अलग आयामों पर काम करते हैं: लेबल बनाम संख्याएँ। गलत विधि चुनने से क्रम अप्रत्याशित रह सकता है या अनुपस्थित अक्ष से जुड़ी त्रुटियाँ आ सकती हैं। यह भेद समझ लेने से रैंकिंग, शीर्ष प्रविष्टियाँ चुनना या लीडरबोर्ड बनाना अपेक्षित तरीके से होता है।
मुख्य बातें
DataFrame के स्तंभों पर max जैसी एग्रीगेशन के बाद याद रखें कि आपके पास Series है। यदि उद्देश्य परिमाण के आधार पर क्रमबद्ध करना है, तो sort_values के साथ ascending=False उपयोग करें। यदि आपको लेबलों के वर्णानुक्रम या कालानुक्रम के हिसाब से क्रम चाहिए, तो sort_index इस्तेमाल करें। ऑब्जेक्ट के प्रकार और सॉर्ट के लक्ष्य को संरेखित रखना समय बचाता है और अनावश्यक त्रुटियों से बचाता है।
यह लेख StackOverflow पर प्रश्न (लेखक: Zilore Mumba) और 0ro2 के उत्तर पर आधारित है।