Python/Pandas

[Pandas] 데이터프레임에서 열/행/그룹별/전체 최댓값, 최솟값 구하기(df.max(), df.min())

jimmy_AI 2022. 5. 23. 20:27
반응형

파이썬 판다스 max, min 탐색 방법 예제

파이썬에서 판다스 모듈을 활용하여 최댓값과 최솟값을 찾는 방법들을

특정 컬럼, 특정 row, 그룹별, 그리고 데이터프레임 전체에 대하여 예시를 들면서

다루어보도록 하겠습니다.

 

이해를 돕기 위하여, 아래와 같이 학생들의 과목별 점수가 담긴 데이터프레임 df를

가정하고 최댓값, 최솟값을 구하는 예시를 살펴보겠습니다.

import pandas as pd

a = {'이름' : ['AAA', 'BBB', 'CCC', 'DDD', 'EEE', 'FFF'], '반' : ['A', 'A', 'A', 'B', 'B', 'B'], \
     '국어' : [70, 95, 80, 60, 75, 90], '영어' : [80, 85, 75, 90, 65, 70], '수학' : [100, 80, 55, 85, 80, 75]}
df = pd.DataFrame(a)
df

 

 

열 기준 최대, 최소 찾기

기본적으로 df.max() 형태로 데이터프레임에 max 메소드를 적용하면

컬럼별 최댓값이 Series 형태로 반환됩니다. 문자열 사이에서도 비교가 가능하니 참고해주세요.

최솟값은 마찬가지로 df.min() 형태로 확인이 가능합니다.

df.max()

# 결과
이름    FFF
반       B
국어     95
영어     90
수학    100
dtype: object

 

만일, 특정 열 내에서의 최댓값을 확인하고 싶다면 df['열 이름'].max() 형태나

df.max()['열 이름'] 형태로 값을 가져오시면 됩니다.

# 두 경우 모두 가능(최솟값은 max 대신 min으로 대체)
df['국어'].max() # 95
df.max()['국어'] # 95
반응형

행 기준 최대, 최소 찾기

각 행을 기준으로 최댓값을 탐색하고 싶다면

df.max(axis = 1) 형태로 비교 축의 방향을 결정하는 axis 인자를 1로 지정해주시면 됩니다.

(마찬가지로, 최솟값은 min 함수로 동일하게 적용 가능합니다.)

 

다만, 문자열과 숫자 간의 비교는 불가능하여 경고 메시지가 발생할 수 있으며,

이를 원하지 않는 경우는 numeric_only 옵션을 True로 설정해주시면 됩니다.

df.max(axis = 1, numeric_only = True)

# 결과
0    100
1     95
2     80
3     90
4     80
5     90
dtype: int64

 

특정 행 내에서만 최대, 최소를 탐색하고 싶은 경우에는

위의 결과에서 해당 행의 max/min 값을 인덱스를 기준으로 추출해주시면 됩니다.

(참고로, Series는 max/min 함수 사용 시, numeric_only 인자 지정이 불가능하여

먼저 모든 행의 max 값들을 추려낸 뒤, 해당 행의 값만 가져오는 방법이 좋습니다.)

# 4번 인덱스를 가진 행의 최댓값 추출(최솟값은 max 대신 min으로 대체)
df.max(axis = 1, numeric_only = True)[4] # 80

 

 

그룹 기준 최대, 최소 찾기

이번에는 '반'이라는 그룹을 기준으로 해당 그룹 내 과목별 최대, 최소 점수를

추출해보는 예시를 살펴보겠습니다.

 

groupby 함수를 통하여 그룹화를 진행해준 뒤, 원하는 과목의 열 이름을 적고

max() 또는 min() 함수를 적용하여 각 그룹의 최댓값(최솟값)만을 가져오시면 됩니다.

 

각 반별 국어 점수의 최댓값을 가져온 예시는 다음과 같습니다.

df.groupby('반')['국어'].max()

# 결과
반
A    95
B    90
Name: 국어, dtype: int64

 

 

데이터프레임 전체에서 최대, 최소 찾기

데이터프레임 전체에서 최댓값과 최솟값을 찾는 방법은

max(또는 min) 함수를 열, 행 방향으로 1번씩 총 2번 적용해주시면 됩니다.

 

이 때, 행/열 방향 중 함수를 적용하는 방향의 순서는 상관이 없지만,

문자열이 데이터프레임에 섞인 경우는 numeric_only를 첫 번째 max나 min에서

반드시 True로 지정하고 진행을 해야한다는 점에 유의해주세요.

df.max(numeric_only=True).max() # 100