데이터프레임을 정렬하는 방법입니다.
데이터프레임은 인덱스(index)와 컬럼값(value)이 있는데 그에 맞게 정렬을 할 수 있습니다.
인덱스 정렬을 하려면 sort_index() 메쏘드를 컬럼의 값 정렬을 위해서는 sort_value() 메쏘드를 쓰면 됩니다.
분류기 머신러닝이나 인공지능 입문자들이 많이 쓰는 연습용 데이터셋인 아이리스 데이터셋으로 해보겠습니다.
아이리스 데이터셋을 다루는게 목적이 아니니 설명은 생략하겠습니다.
필요한 것만 하겠습니다.
데이터 셋팅
import pandas as pd
from sklearn.datasets import load_iris
iris = load_iris()
df = pd.DataFrame(data=iris.data,columns = iris.feature_names)
인덱스 정렬
현재의 인덱스는 숫자로 되어 있어서 이미 내림차순입니다.
오름차순으로 해보겠습니다.
정렬을 할 때 sort_index의 ascending 파라미터로 정렬을 합니다.
디폴트값이 오름차순이므로 오름차순은 True, 내림차순은 False 로 선택해주면 됩니다.
df_sort_index = df.sort_index(ascending=False)
df_sort_index
컬럼 값 정렬
컬럼 값을 정렬하려면 sort_values() 로 하는데 컬럼은 여러 개이므로 무엇을 기준으로 정렬을 할 것인지 정해주어야 합니다. by 파라미터로 정해줍니다. by = '원하는 컬럼' 또는 정렬할 컬럼이 두개 이상일때는 by=['원하는 컬럼1','원하는 컬럼2',...]으로 리스트로 넣어주면 되겠습니다.
sort_values()의 파라미터는 다음과 같습니다.
df.sort_values(by,axis=0, ascending=True, inplace=False, na_position='last', ignore_index=False,...)
- by : 정렬의 기준이 될 행/열 지정. 리스트로 정렬의 기준이 될 컬럼이나 인덱스를 입력하면 된다.
- axis : 0(default)는 행, 1은 열을 기준으로 정렬
- ascending : 오름차순 여부. True(defualt)는 오름차순, False는 내림차순
- inplace : 기존 데이터프레임에 저장할지에 대한 여부. True면 기존 데이터프레임에 바로 반영된다.
- na_position : NaN 값 위치 여부, 맨위(first) 또는 맨 아래(lalst)만 가능, 디폴트는 last.
- ignore_index : True로 놓으면 index가 0,1,..로 다시 라벨링됨.
axis는 조건이 까다롭습니다. 사실상 안된다 생각하면 됩니다.
지금 iris의 컬럼을 보면 오타 나오기 딱 좋게 되어있어서 columns으로 리스트를 만들어서 번호로 넣겠습니다.
df.columns을 요청하면 컬럼을 번호로 불러올 수 있습니다.
df.columns
한개의 컬럼 정렬
첫번째 컬럼인 'sepal length(cm)' 을 내림차순으로 정렬하겠습니다.
df_sort_value = df.sort_values(by=df.columns[0],ascending=False)
df_sort_value
두개 이상 컬럼 정렬
다 같은 방식이므로 두개만 해봅시다.
첫번째 컬럼과 두번째 컬럼으로 내림차순 정렬을 해보겠습니다.
df_sort_value_double = df.sort_values(by=[df.columns[0],df.columns[1]],ascending=False)
df_sort_value_double
비교를 해보면 알겠지만 두번째 컬럼도 내림차순으로 정렬이 되는 것을 볼 수 있습니다.
컬럼이 두개인 경우부터는 순서가 굉장히 중요한데 컬럼 입력순서가 정렬 우선순위가 되기 때문입니다.
df.columns[0], df.columns[1]의 입력순서를 바꿔보겠습니다.
df_sort_value_double = df.sort_values(by=[df.columns[1],df.columns[0]],ascending=False)
df_sort_value_double
이와 같이 순서가 달라지는 것을 볼 수 있습니다.
결측치 정렬(맨위 또는 맨아래)
결측치가 있으면 일반적으로 맨아래에 배치됩니다. na_position='first'를 이용해 맨 위로 끌어올릴 수 있습니다.
현재 iris는 결측치가 없으므로 다른 데이터를 임시로 만들어 NaN을 맨 위로 올려보겠습니다.
obj = {'Name':['Jucy','Via','Henry','Harry','Andy'], 'Age':[20,24,23,21,np.NaN],'Math_Score':[90,80,85,95,100]}
df = pd.DataFrame(obj)
df
데이터프레임을 출력하면 NaN은 맨아래에 있습니다.
하지만 na_position을 쓰면 맨 위로 올릴 수 있습니다.
df.sort_values(by = ['Age'],na_position='first')
정렬 기준이 NaN이 없는 컬럼으로 설정하면 먹히지 않습니다.
df.sort_values(by=['Math_Score'],na_position='first')
이상으로 데이터프레임 정렬 방식이었습니다.
관련 포스팅
[Pandas] column 이름 바꾸기(df.rename)
'Python > Pandas' 카테고리의 다른 글
[Pandas] 데이터프레임 멀티인덱스 다루기(loc,xs) (0) | 2021.07.18 |
---|---|
[Pandas] 어디까지 열 수 있니?(I/O with pandas) (4) | 2021.06.25 |
[Pandas]Rolling Statistics (0) | 2021.06.04 |
[Pandas] 데이터프레임 타입 바꾸기(astype) (5) | 2021.05.28 |
[Pandas] column 이름 바꾸기(df.rename) (0) | 2021.05.27 |