نحوه پیدا کردن ردیف دارای بیشترین مقدار برای ستون مشخص پس از اعمال groupby در Pandas
فرض کنید که دیتاستی شامل سه ستون Sp و Mt و count داریم و می خواهیم بر اساس دو ستون Mt و Sp گروه بندی انجام دهیم و مقدار ستون count
برابر با بیشترین مقدار بین ردیف های هر گروه باشد. برای مثال دیتاست زیر را در نظر بگیرید.
Sp Mt Value count
0 MM1 S1 a **3**
1 MM1 S1 n 2
2 MM1 S3 cb **5**
3 MM2 S3 mk **8**
4 MM2 S4 bg **10**
5 MM2 S4 dgd 1
6 MM4 S2 rd 2
7 MM4 S2 cb 2
8 MM4 S2 uyi **7**
پس از گروه بندی، می خواهیم تعداد از ردیفی که بیشترین مقدار را دارد برداشته شود. یعنی به صورت زیر:
Sp Mt Value count
0 MM1 S1 a **3**
2 MM1 S3 cb **5**
3 MM2 S3 mk **8**
4 MM2 S4 bg **10**
8 MM4 S2 uyi **7**
راه حل اول:
یکی از روشها استفاده از متد groupby
و سپس transform
است تا ماکزیمم را برای هر گروه به دست آوریم. به این ترتیب میتوانیم اندیسهای ردیفهایی که این ماکزیمم را دارند شناسایی کنیم:
idx = df.groupby(['Sp', 'Mt'])['count'].transform(max) == df['count']
result = df[idx]
این کد به ما اجازه میدهد تمامی ردیفهایی را که مقدار count
آنها ماکسیمم در گروه است، استخراج کنیم. اگر تعداد ماکزیممهای تکراری وجود داشته باشد، همه آنها بازگردانده میشوند.
راه حل دوم:
راه حل دیگر این است که دیتافریم را بر اساس count ابتدا مرتب کنیم و سپس داپلیکیت های ستون Sp و Mt را حذف کنیم
result = df.sort_values('count', ascending=False).drop_duplicates(['Sp', 'Mt'])
این روش سریع و کارآمد بوده و در دیتافریمهای بزرگ تر نیز خوب عمل میکند.
راه حل سوم:
همچنین میتوان از متد idxmax()
برای به دست آوردن اندیس ردیفهایی که بیشترین مقدار count
را دارند، استفاده کرد:
result = df.loc[df.groupby(['Sp', 'Mt'])['count'].idxmax()]
این روش نیز میتواند به سادگی ردیفهایی با حداکثر مقدار را بازیابی کند.