Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

Python Pandas DataFrame에서 각 그룹 중 가장 큰 그룹을 선택하는 방법은 무엇입니까?

<시간/>

소개

데이터 분석 중에 수행하는 가장 기본적이고 일반적인 작업 중 하나는 그룹 내 일부 열의 가장 큰 값을 포함하는 행을 선택하는 것입니다. 이번 포스트에서는 DataFrame 내에서 각 그룹 중 가장 큰 그룹을 찾는 방법을 알려드리겠습니다.

문제..

먼저 작업을 이해하고 영화 데이터 세트가 제공되고 인기도에 따라 매년 가장 인기 있는 영화를 나열하도록 요청받았다고 가정합니다.

그것을 하는 방법..

1.데이터 준비.

Google은 데이터 세트로 가득 차 있습니다. 저는 종종 kaggle.com을 사용하여 데이터 분석에 필요한 데이터 세트를 얻습니다. kaggle.com에 로그인하여 영화를 검색하세요. 영화 데이터 세트를 디렉토리에 다운로드하고 Pandas DataFrame으로 가져옵니다.

저처럼 kaggle.com에서 데이터를 다운로드하셨다면 데이터를 도와주신 분에게 좋아요를 눌러주세요.

판다를 pdimport numpy로 npmovies =pd.read_csv("https://raw.githubusercontent.com/sasankac/TestDataSet/master/movies_data.csv")
로 가져오기
# 샘플 5 rowsprint(f"출력 \n\n*** {movies.sample(n=5)} ")

출력

 *** 예산 ID Original_language Original_Title 인기 \ 2028 22000000 235260 en god의 아들 9.1757622548 0 13411 en malibu의 가장 원했던 7.314757622548 0 13411 ko malibu의 가장 원했던 7.3147963279 8000000 26306 ko prefontaine 8.7172353627 5000000 10217 en 달콤한 이후 7.6731244555 0 98568 ko Enternere 3.637857Release_Date 수익 런타임 상태 제목 \ 202/2014 67800064 138.0의 아들 of God2548 10/04/2003 0 86.0 릴리스 Malibu의 가장 wanted3279 24/01/1997 589304 106.0 릴리스 Prefontainee3627 14/05/1997 3263585 112.0 elected sweet hereafter4555 22/10/2011 0 90.0 출시 Enter Nowherevote_average vote_count2028 5.9 832548 4.7 773279 6.7 213627 6.8 1034555 6.5 49

2. 데이터를 이해하기 위해 몇 가지 기본 데이터 분석을 수행합니다.

# 데이터 유형 식별print(f"출력 \n*** 데이터 유형은 {movies.dtype} ")

출력

*** 데이터 유형은 예산 int64id int64original_language objectoriginal_title objectpopularity float64release_date objectrevenue int64runtime float64status objecttitle objectvote_average float64vote_count int64dtype:object

2. 이제 메모리 사용량을 줄이려면 float64 및 int64의 데이터 유형을 변환할 수 있습니다. 하지만 데이터 유형을 변환하기 전에 조심하고 숙제를 해야 합니다.

# 최대 숫자 값 확인.print(f"출력 \n *** 숫자 데이터 유형의 최대 값 - {movies.select_dtypes(exclude=['object']).unstack().max()}" )# 최대 투표 수 valueprint(f" *** 투표 수 최대 값 - {movies[['vote_count']].unstack().max()}")# 최대 영화 런타임 값은 얼마입니까print(f " *** 영화 ID 최대값 - {movies[['runtime']].unstack().max()}")

출력

*** 숫자 데이터 유형의 최대값 - 2787965087.0*** 투표 수 최대값 - 13752*** 영화 ID 최대값 - 338.0

3. 64비트로 표현할 필요가 없고 16비트로 줄여도 되는 컬럼이 있으니 해보자. 64비트 int 범위는 -32768 ~ +32767입니다. 저는 vote_count 및 런타임에 대해 수행하고 메모리 저장 공간이 더 적게 필요한 열에 대해 수행할 수 있습니다.

4. 이제 매년 가장 인기 있는 영화를 식별하려면 release_date별로 그룹화하고 인기도의 최대값을 가져와야 합니다. 일반적인 SQL은 다음과 같습니다.

영화 GROUP BY 개봉 연도에서 가장 인기 있는 영화 선택

5. 불행하게도 우리의 release_date는 Object 데이터 유형이므로 datetime으로 변환하는 몇 가지 방법이 있습니다. 그룹화에 해당 열을 사용할 수 있도록 연도만 사용하여 새 열을 생성하겠습니다.

영화['연도'] =pd.to_datetime(영화['릴리스_날짜']).dt.year.astype('Int64')print(f"출력 \n ***{movies.sample(n=5) )}")

출력

 *** 예산 ID Original_language Original_title 인기 \ 757 0 87825 곡선과 함께 문제가 18.587114711 58000000 39514 en 레드 41.4302451945 13500000 152742 ko la migliore offerta 30.0582632763 13000000 16406 en dick 4.7425374595 350000 764 en 악의 죽음 35.037625Release_Date 수익 런타임 상태 제목 \ 757 21/09/2012 0 111.0 Curve711의 문제 해결 71664962 71664962 111.0 릴리스 Red1945 1/01/2013 19255873 124.0 최상의 offers2763 4/08/1999 27500000 94.0 출시 dick4595 15/10/1981 29400000 85.0 출시된 The Evil Deadvote_average vote_count year757 6.6 366 2012711 6.6 2808 20101945 7.7 704 20132763 5.7 67 19994595 7.3 894>198 

방법 1 - Group By를 사용하지 않고

6. 3개의 열, 영화 제목, 영화 개봉 연도 및 인기만 있으면 됩니다. 따라서 해당 열을 선택하고 연도의 sort_values를 사용하여 결과가 어떻게 보이는지 확인합니다.

print(f"출력 \n *** 방법 1- Group By를 사용하지 않고")movies[["title", "year", "popularity"]].sort_values("year", ascending=True) 

출력

*** Group By를 사용하지 않음


<머리><번째>
제목 연도 인기
4592 불관용 1916년 3.232447
4661 빅 퍼레이드 1925년 0.785744
2638 대도시 1927년 32.351527
4594 브로드웨이 멜로디 1929년 0.968865
4457 판도라의 상자 1929년 1.824184
... ... ... ...
2109 나보다 먼저 2016년 53.161905
3081 2016년 19.865989
2288 파이트 밸리 2016년 1.224105
4255 스미스 성장 2017 0.710870
4553 미국은 여전히 ​​​​장소입니다 0.000000

4803행 × 3열

8. 이제 결과를 보면 인기도도 정렬하여 1년 동안 가장 인기 있는 영화를 가져와야 합니다. 관심 있는 열을 목록으로 전달합니다. Ascending=False는 내림차순으로 결과를 정렬합니다.

영화[["제목", "연도", "인기"]].sort_values(["연도","인기"], 오름차순=거짓)


<머리><번째>
제목 연도 인기
4255 스미스 성장 2017 0.710870
788 데드풀 2016년 514.569956
26 캡틴 아메리카:시빌 워 2016년 198.372395
10 배트맨 대 슈퍼맨:저스티스의 시작 2016년 155.790452
64 엑스맨:아포칼립스 2016년 139.272042
... ... ... ...
4593 브로드웨이 멜로디 1929년 0.968865
2638 대도시 1927년 32.351527
4660 빅 퍼레이드 1925년 0.785744
4591 불관용 1916년 3.232447
4552 미국은 여전히 ​​​​장소입니다 0.000000

4802행 × 3열

9. 자, 이제 데이터가 완벽하게 정렬되었습니다. 따라서 다음 단계는 매년 첫 번째 값을 유지하고 나머지는 제거하는 것입니다. 어떻게 하는지 맞춰보세요.

우리는 .drop_duplicates 메소드를 사용할 것입니다.

영화[["제목", "연도", "인기"]].sort_values(["연도","인기"], 오름차순=False).drop_duplicates(subset="연도")


<머리><번째>
제목 연도 인기
4255 스미스 성장 2017 0.710870
788 데드풀 2016년 514.569956
546 미니언 2015년 875.581305
95 인터스텔라 2014년 724.247784
124 냉동 2013년 165.125366
... ... ... ...
4456 판도라의 상자 1929년 1.824184
2638 대도시 1927년 32.351527
4660 빅 퍼레이드 1925년 0.785744
4591 불관용 1916년 3.232447
4552 미국은 여전히 ​​​​장소입니다 0.000000

91행 × 3열

방법 2 - 그룹화 사용

groupby에서도 동일한 결과를 얻을 수 있습니다. 접근 방식은 위에 표시된 SQL과 매우 유사합니다.

print(f"출력 \n *** 방법 2 - Group By 사용")movies[["title", "year", "popularity"]].groupby("year", as_index=False).apply (람다 df:df.sort_values("인기", 오름차순=False).head(1)).droplevel(0).sort_values("연도", 오름차순=거짓)

출력

*** 방법 2 - Group By 사용


<머리><번째>
제목 연도 인기
4255 스미스 성장 2017 0.710870
788 데드풀 2016년 514.569956
546 미니언 2015년 875.581305
95 인터스텔라 2014년 724.247784
124 냉동 2013년 165.125366
... ... ... ...
3804 지옥의 천사들 1930년 8.484123
4457 판도라의 상자 1929년 1.824184
2638 대도시 1927년 32.351527
4661 빅 퍼레이드 1925년 0.785744
4592 불관용 1916년 3.232447

90행 × 3열