परिचय
डेटा विश्लेषण के दौरान करने के लिए सबसे बुनियादी और सामान्य ऑपरेशन्स में से एक है ग्रुप के भीतर किसी कॉलम के सबसे बड़े मान वाली पंक्तियों का चयन करना। इस पोस्ट में, मैं आपको दिखाऊंगा कि DataFrame के भीतर प्रत्येक ग्रुप का सबसे बड़ा मान कैसे ढूंढें।
समस्या
कार्य को समझते हैं, मान लीजिए आपको एक मूवीज डेटासेट दिया गया है और लोकप्रियता के आधार पर प्रत्येक वर्ष की सबसे लोकप्रिय फिल्म सूचीबद्ध करने का अनुरोध किया गया है।
कैसे करें
1. डेटा तैयार करना
Google डेटासेट्स से भरा पड़ा है। मैं अक्सर kaggle.com का उपयोग अपने डेटा विश्लेषण के लिए आवश्यक डेटासेट प्राप्त करने के लिए करता हूं। बेझिझक kaggle.com पर लॉगिन करें और मूवीज खोजें। मूवीज डेटासेट डाउनलोड करें और इसे पैंडास DataFrame में इंपोर्ट करें।
import pandas as pd
import numpy as np
movies = pd.read_csv("https://raw.githubusercontent.com/sasankac/TestDataSet/master/movies_data.csv")
# 5 पंक्तियों का सैंपल देखें
print(f"Output \n\n*** {movies.sample(n=5)} ")
2. बेसिक डेटा विश्लेषण करके डेटा समझें
# डेटा टाइप्स पहचानें
print(f"Output \n*** Datatypes are {movies.dtypes} ")
# अधिकतम न्यूमेरिक वैल्यू जांचें
print(f"Output \n *** maximum value for Numeric data type - {movies.select_dtypes(exclude=['object']).unstack().max()}")
print(f" *** Vote count maximum value - {movies[['vote_count']].unstack().max()}")
print(f" *** Movie Id maximum value - {movies[['runtime']].unstack().max()}")
3. मेमोरी उपयोग अनुकूलित करें
कुछ कॉलम्स को 64 बिट में रिप्रेजेंट करने की आवश्यकता नहीं है और उन्हें 16 बिट तक लाया जा सकता है।
4. प्रत्येक वर्ष के लिए सबसे लोकप्रिय फिल्म पहचानें
हमें release_date द्वारा ग्रुप करके popularity का अधिकतम मान प्राप्त करने की आवश्यकता है। एक विशिष्ट SQL इस तरह दिखता है:
SELECT movie with max popularity FROM movies GROUP BY movie released year
दुर्भाग्य से हमारा release_date एक ऑब्जेक्ट डेटा-टाइप है। इसे डेटाइम में बदलने के कुछ तरीके हैं। मैं केवल वर्ष के साथ एक नया कॉलम बनाना चुनूंगा ताकि उस कॉलम का उपयोग ग्रुपिंग के लिए किया जा सके।
movies['year'] = pd.to_datetime(movies['release_date']).dt.year.astype('Int64')
print(f"Output \n ***{movies.sample(n=5)}")
विधि 1 - ग्रुप बाय के बिना
हमें केवल 3 कॉलम चाहिए: मूवी टाइटल, रिलीज़ वर्ष और लोकप्रियता। तो हम उन कॉलम्स को चुनते हैं और sort_values का उपयोग करते हैं।
print("Output \n *** Method 1- Without Using Group By")
movies[["title", "year", "popularity"]].sort_values("year", ascending=True)
अब परिणामों को देखकर, हमें लोकप्रियता के अनुसार भी सॉर्ट करने की आवश्यकता है ताकि प्रत्येक वर्ष की सबसे लोकप्रिय फिल्म मिल सके। रुचि के कॉलम्स को सूची के रूप में पास करें। ascending=False परिणाम को अवरोही क्रम में सॉर्ट करेगा।
movies[["title", "year", "popularity"]].sort_values(["year","popularity"], ascending=False)
अब डेटा पूरी तरह से सॉर्ट हो गया है। अगला कदम प्रत्येक वर्ष के लिए केवल पहला मान रखना और बाकी को हटाना है। drop_duplicates मेथड का उपयोग करें।
movies[["title", "year", "popularity"]].sort_values(["year","popularity"], ascending=False).drop_duplicates(subset="year")
विधि 2 - ग्रुप बाय का उपयोग करके
हम वही groupby के साथ भी प्राप्त कर सकते हैं। दृष्टिकोण ऊपर दिखाए गए SQL के समान है।
print("Output \n *** Method 2 - Using Group By")
movies[["title", "year", "popularity"]].groupby("year", as_index=False).apply(
lambda df: df.sort_values("popularity", ascending=False).head(1)
).droplevel(0).sort_values("year", ascending=False)