안녕하세요! 이번 포스팅에서는 Python의 pandas 라이브러리를 사용하여 DataFrame을 오름차순, 내림차순이 아닌 특정 컬럼의 값을 원하는 순서대로 정렬하는 방법을 소개하고자 합니다. 정렬의 기준으로 만들고 싶은 컬럼을 pandas의 Categorical과 sort_values() 메서드를 사용해 순서형 변수로 만드는 방법인데요. 예시로 Pokemon Database에 있는 불, 물, 풀, 전기 포켓몬 데이터를 활용해 어떻게 사용할 수 있는지 알아보겠습니다.
포켓몬 데이터 가져오기
먼저 예시로 사용할 포켓몬 데이터를 가져오겠습니다. (데이터 출처: Pokemon Database)
import requests
import pandas as pd
from bs4 import BeautifulSoup as bs
# 포켓몬 데이터 가져오기
url = "https://pokemondb.net/pokedex/all"
response = requests.get(url)
html_text = response.text
html = bs(html_text, "html.parser")
df = pd.read_html(str(html))[0]
# 카테고리 전처리 : 첫번째 타입이 불, 물, 풀, 전기 타입인 포켓몬만 고려
df = df[df["Type"].isin(["Fire", "Water","Glass","Electric"])].reset_index()
컬럼을 순서형 변수로 변환하기
가져온 포켓몬 데이터에서 단순히 Type 컬럼을 기준으로 정렬하면 [Electric - Fire - Glass - Water] 또는 [Water - Glass - Fire - Electric]의 순서로 정렬됩니다. 데이터를 [Fire - Water - Glass - Electric] 순서로 정렬되게 하고 싶다면, Type 컬럼을 순서형 변수로 변환한 뒤에 정렬하면 됩니다.
# 포켓몬 타입을 순서형 변수로 변환
df['Type'] = pd.Categorical(df['Type'],
categories=['Fire', 'Water', 'Glass', 'Electric'],
ordered=True)
# Type 기준으로 정렬
df_sorted = df.sort_values(by='Type')
코드를 사용한 결과를 확인하면 원하는 순서대로 정렬된 것을 확인할 수 있습니다. 순서형 변수로 변환하지 않고 정렬할 경우 알파벳을 기준으로 정렬되기 때문에 원하는 순서가 있는 경우 이와 같은 방법을 사용할 수 있습니다.
수정 가능하도록 다시 세팅하는 방법
순서형 변수로 변환해 사용할 때의 주의점은 Categorical로 변환한 컬럼은 수정이 불가능한 상태가 된다는 것입니다. 만약 해당 컬럼을 다시 수정 가능한 상태로 돌리고 싶다면 astype() 메서드를 사용해 문자열로 변환하면 됩니다.
# Type 컬럼을 다시 문자열로 변환하여 수정 가능하도록 설정
df['Type'] = df['Type'].astype(str)
pandas의 Categorical과 sort_values() 메서드를 사용해 내가 원하는 순서대로 정렬하는 방법을 소개했습니다. 데이터를 단순히 오름차순, 내림차순이 아닌 원하는 순서로 정렬하고 싶은 상황에 도움이 되길 바랍니다. 오늘도 읽어주셔서 감사합니다.