Giới thiệu
Một trong những thao tác cơ bản và phổ biến nhất cần thực hiện trong quá trình phân tích dữ liệu là chọn các hàng chứa giá trị lớn nhất của một số cột trong một nhóm. Trong bài đăng này, tôi sẽ chỉ cho bạn cách tìm nhóm lớn nhất trong mỗi nhóm trong DataFrame.
Vấn đề ..
Trước tiên, hãy để chúng tôi hiểu nhiệm vụ, giả sử bạn được cung cấp một tập dữ liệu phim và được yêu cầu liệt kê bộ phim nổi tiếng nhất mỗi năm dựa trên mức độ phổ biến.
Cách thực hiện ..
1.Chuẩn bị dữ liệu.
Vâng, Google có đầy đủ các bộ dữ liệu. Tôi thường sử dụng kaggle.com để lấy bộ dữ liệu tôi cần cho việc phân tích dữ liệu của mình. Hãy đăng nhập vào kaggle.com và tìm kiếm các bộ phim. Tải tập dữ liệu phim xuống thư mục và nhập vào Pandas DataFrame.
Nếu bạn đã tải xuống dữ liệu giống như tôi từ kaggle.com, hãy thích người đã giúp bạn cung cấp dữ liệu.
import pandas as pd import numpy as np movies = pd.read_csv("https://raw.githubusercontent.com/sasankac/TestDataSet/master/movies_data.csv")
# see sample 5 rows print(f"Output \n\n*** {movies.sample(n=5)} ")
Đầu ra
*** budget id original_language original_title popularity \ 2028 22000000 235260 en Son of God 9.175762 2548 0 13411 en Malibu's Most Wanted 7.314796 3279 8000000 26306 en Prefontaine 8.717235 3627 5000000 10217 en The Sweet Hereafter 7.673124 4555 0 98568 en Enter Nowhere 3.637857 release_date revenue runtime status title \ 2028 28/02/2014 67800064 138.0 Released Son of God 2548 10/04/2003 0 86.0 Released Malibu's Most Wanted 3279 24/01/1997 589304 106.0 Released Prefontaine 3627 14/05/1997 3263585 112.0 Released The Sweet Hereafter 4555 22/10/2011 0 90.0 Released Enter Nowhere vote_average vote_count 2028 5.9 83 2548 4.7 77 3279 6.7 21 3627 6.8 103 4555 6.5 49
2. Thực hiện một số phân tích dữ liệu cơ bản để hiểu dữ liệu.
# Identify the data-types print(f"Output \n*** Datatypes are {movies.dtypes} ")
Đầu ra
*** Datatypes are budget int64 id int64 original_language object original_title object popularity float64 release_date object revenue int64 runtime float64 status object title object vote_average float64 vote_count int64 dtype: object
2. Bây giờ, nếu chúng ta muốn tiết kiệm nhiều bộ nhớ sử dụng, chúng ta có thể chuyển đổi các kiểu dữ liệu của float64 và int64. Nhưng chúng ta phải cẩn thận và làm bài tập về nhà trước khi chuyển đổi kiểu dữ liệu.
# Check the maximum numeric value. print(f"Output \n *** maximum value for Numeric data type - {movies.select_dtypes(exclude=['object']).unstack().max()}") # what is the max vote count value print(f" *** Vote count maximum value - {movies[['vote_count']].unstack().max()}") # what is the max movie runtime value print(f" *** Movie Id maximum value - {movies[['runtime']].unstack().max()}")
Đầu ra
*** maximum value for Numeric data type - 2787965087.0 *** Vote count maximum value - 13752 *** Movie Id maximum value - 338.0
3. Có những cột không cần biểu diễn bằng 64 bit và có thể đưa xuống 16 bit, vậy chúng ta cùng làm nhé. Phạm vi int 64 Bit là từ -32768 đến +32767. Tôi sẽ làm điều đó cho vote_count và thời gian chạy và bạn có thể làm điều đó cho các cột yêu cầu ít bộ nhớ hơn.
4. Bây giờ, để xác định bộ phim phổ biến nhất cho mỗi năm, chúng ta cần nhóm theo ngày phát hành và lấy giá trị phổ biến tối đa. Một SQL điển hình trông giống như bên dưới.
SELECT movie with max popularity FROM movies GROUP BY movie released year
5. Thật không may, release_date của chúng tôi là kiểu dữ liệu Object, có một số cách để chuyển đổi chúng thành datetime. Tôi sẽ chọn tạo một cột mới chỉ với năm để tôi có thể sử dụng cột đó để nhóm.
movies['year'] = pd.to_datetime(movies['release_date']).dt.year.astype('Int64') print(f"Output \n ***{movies.sample(n=5)}")
Đầu ra
*** budget id original_language original_title popularity \ 757 0 87825 en Trouble with the Curve 18.587114 711 58000000 39514 en RED 41.430245 1945 13500000 152742 en La migliore offerta 30.058263 2763 13000000 16406 en Dick 4.742537 4595 350000 764 en The Evil Dead 35.037625 release_date revenue runtime status title \ 757 21/09/2012 0 111.0 Released Trouble with the Curve 711 13/10/2010 71664962 111.0 Released RED 1945 1/01/2013 19255873 124.0 Released The Best Offer 2763 4/08/1999 27500000 94.0 Released Dick 4595 15/10/1981 29400000 85.0 Released The Evil Dead vote_average vote_count year 757 6.6 366 2012 711 6.6 2808 2010 1945 7.7 704 2013 2763 5.7 67 1999 4595 7.3 894 1981
Phương pháp 1 - Không sử dụng nhóm theo
6. Chúng ta chỉ cần 3 cột, tên phim, năm phát hành phim và mức độ phổ biến. Vì vậy, chúng tôi chọn các cột đó và sử dụng sort_values theo năm để xem kết quả như thế nào.
print(f"Output \n *** Method 1- Without Using Group By") movies[["title", "year", "popularity"]].sort_values("year", ascending=True)
Đầu ra
*** Without Using Group By
| tiêu đề | năm | mức độ phổ biến |
---|---|---|---|
4592 | Không khoan dung | 1916 | 3,232447 |
4661 | Cuộc diễu hành lớn | 1925 | 0,785744 |
2638 | Thủ đô | 1927 | 32.351527 |
4594 | Giai điệu Broadway | năm 1929 | 0,968865 |
4457 | Hộp Pandora | năm 1929 | 1.824184 |
... | ... | ... | ... |
2109 | Me Before You | 2016 | 53.161905 |
3081 | Rừng | 2016 | 19.865989 |
2288 | Thung lũng Chiến đấu | 2016 | 1.224105 |
4255 | Smith lớn lên | 2017 | 0,710870 |
4553 | Nước Mỹ vẫn là nơi | | 0,000000 |
4803 hàng × 3 cột
8. Bây giờ nhìn vào kết quả, chúng ta cần phải sắp xếp mức độ nổi tiếng để có được bộ phim ăn khách nhất trong một năm. Chuyển các cột quan tâm dưới dạng danh sách. ascending =False sẽ dẫn đến kết quả sắp xếp theo thứ tự giảm dần.
movies[["title", "year", "popularity"]].sort_values(["year","popularity"], ascending=False)
| tiêu đề | năm | mức độ phổ biến |
---|---|---|---|
4255 | Smith lớn lên | 2017 | 0,710870 |
788 | Deadpool | 2016 | 514.569956 |
26 | Captain America:Civil War | 2016 | 198.372395 |
10 | Batman v Superman:Dawn of Justice | 2016 | 155.790452 |
64 | X-Men:Apocalypse | 2016 | 139.272042 |
... | ... | ... | ... |
4593 | Giai điệu Broadway | năm 1929 | 0,968865 |
2638 | Thủ đô | 1927 | 32.351527 |
4660 | Cuộc diễu hành lớn | 1925 | 0,785744 |
4591 | Không khoan dung | 1916 | 3,232447 |
4552 | Nước Mỹ vẫn là nơi | | 0,000000 |
4802 hàng × 3 cột
9. Được rồi, dữ liệu hiện đã được sắp xếp hoàn hảo. Vì vậy, bước tiếp theo là chỉ giữ giá trị đầu tiên cho mỗi năm và loại bỏ phần còn lại. Đoán cách làm điều đó ?.
Chúng tôi sẽ sử dụng phương thức .drop_duplicates.
movies[["title", "year", "popularity"]].sort_values(["year","popularity"], ascending=False).drop_duplicates(subset="year")
| tiêu đề | năm | mức độ phổ biến |
---|---|---|---|
4255 | Smith lớn lên | 2017 | 0,710870 |
788 | Deadpool | 2016 | 514.569956 |
546 | Quái vật | 2015 | 875.581305 |
95 | Interstellar | 2014 | 724.247784 |
124 | Đông lạnh | 2013 | 165.125366 |
... | ... | ... | ... |
4456 | Hộp Pandora | năm 1929 | 1.824184 |
2638 | Thủ đô | 1927 | 32.351527 |
4660 | Cuộc diễu hành lớn | 1925 | 0,785744 |
4591 | Không khoan dung | 1916 | 3,232447 |
4552 | Nước Mỹ vẫn là nơi | | 0,000000 |
91 hàng × 3 cột
Phương pháp 2 - Sử dụng Group By
Chúng ta cũng có thể đạt được hiệu quả tương tự với groupby. Cách tiếp cận rất giống với SQL được hiển thị ở trên.
print(f"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)
Đầu ra
*** Method 2 - Using Group By
| tiêu đề | năm | mức độ phổ biến |
---|---|---|---|
4255 | Smith lớn lên | 2017 | 0,710870 |
788 | Deadpool | 2016 | 514.569956 |
546 | Quái vật | 2015 | 875.581305 |
95 | Interstellar | 2014 | 724.247784 |
124 | Đông lạnh | 2013 | 165.125366 |
... | ... | ... | ... |
3804 | Thiên thần địa ngục | năm 1930 | 8.484123 |
4457 | Hộp Pandora | năm 1929 | 1.824184 |
2638 | Thủ đô | 1927 | 32.351527 |
4661 | Cuộc diễu hành lớn | 1925 | 0,785744 |
4592 | Không khoan dung | 1916 | 3,232447 |
90 hàng × 3 cột