값을 기준으로 데이터프레임 정렬
• sort_values 메소드
sort_values
(참고링크)를 이용하여 데이터프레임의 값을 기준으로 정렬할 수 있다. 기본적으로 sort_values
는 정렬한 리스트를 반환한다.
예시로는 seaborn의 mpg 데이터셋을 이용하겠다.
import seaborn as sns
import pandas as pd
df = sns.load_dataset("mpg")
mpg 데이터셋을 head
로 불러와 확인해보면 아래와 같이 생겼다.
mpg cylinders displacement horsepower weight acceleration \
0 18.0 8 307.0 130.0 3504 12.0
1 15.0 8 350.0 165.0 3693 11.5
2 18.0 8 318.0 150.0 3436 11.0
3 16.0 8 304.0 150.0 3433 12.0
4 17.0 8 302.0 140.0 3449 10.5
model_year origin name
0 70 usa chevrolet chevelle malibu
1 70 usa buick skylark 320
2 70 usa plymouth satellite
3 70 usa amc rebel sst
4 70 usa ford torino
• 매개변수
by
는 정렬 기준이 될 열의 이름을 받는다. 만약 기준이 여러개라면, 예를 들어서 cylinders를 기준으로 정렬하고, cylinders가 같은 경우 horsepower를 기준으로 정렬하고 싶다면, 리스트 형태로 넣어주면 된다.
axis
는 열이 아니라 행을 기준으로 정렬하고 싶은 경우 1로 설정하여 사용하는데, 대부분 경우 열을 기준으로 잡기 때문에 잘 사용하지 않는다.
ascending
은 기본적으로 True
로 설정되어 있다. 만약 내림차순으로 정렬하고 싶다면 False
로 변경하면 된다. 앞서 by
를 통해 기준을 여러가지로 잡은 경우 각 기준에 따라 리스트를 만들어 설정해줄 수도 있다.
na_position
은 기본적으로 "last"
로 되어 있는데, 이는 결측값을 앞에 놓을지, 뒤에 놓을지에 관한 것으로 "first"
로 설정하여 앞에 놓을 수도 있다.
kind
를 통해 정렬 방식을 선택할 수 있다. 기본적으로는 퀵정렬(참고링크)로 되어 있는데, 퀵정렬이 정렬된 상태에 데이터에서 정렬이 느린 특징이 있기 때문에 다른 정렬을 선택할 수도 있다. 자세한 내용은 위 sort_values
레퍼런스를 참고하면 된다.
ignore_index
를 통해 정렬 후 인덱스를 바꿔줄 수 있다. 기본적으로 False
로 되어 있는데, 이 경우 행들은 정렬 후에도 원래의 인덱스를 가진다. 만약 인덱스를 다시 정렬하고 싶다면 이를 True
로 바꿔주면 된다.
inplace
를 통해 원본 객체 수정 여부를 선택할 수 있다. 기본은 False
이고, 때문에 정렬된 데이터프레임을 반환할 뿐 원본 데이터는 변형하지 않지만, True
로 바꾼다면 원본 데이터를 정렬한다. 참고로 True
인 경우 정렬된 데이터를 반환하지 않으니 주의해야 한다.
key
를 통해 정렬 기준에 대한 함수를 설정할 수도 있다. 보통 lamda
를 활용하여 넣는다.
• 예시
예를 들어 mpg 데이터셋을 cylinders를 기준으로 정렬해보겠다. 이때 내림차순으로, 결측값을 맨 앞으로, 정렬 방식은 합병정렬로 설정하겠다.
df_sorted = df.sort_values(by="cylinders", ascending=False, kind="mergesort", na_position="first")
이제 정렬된 데이터인 df_sorted
를 프린트해보면 다음과 같다.
mpg cylinders displacement horsepower weight acceleration \
0 18.0 8 307.0 130.0 3504 12.0
1 15.0 8 350.0 165.0 3693 11.5
2 18.0 8 318.0 150.0 3436 11.0
3 16.0 8 304.0 150.0 3433 12.0
4 17.0 8 302.0 140.0 3449 10.5
.. ... ... ... ... ... ...
397 31.0 4 119.0 82.0 2720 19.4
71 19.0 3 70.0 97.0 2330 13.5
111 18.0 3 70.0 90.0 2124 13.5
243 21.5 3 80.0 110.0 2720 13.5
334 23.7 3 70.0 100.0 2420 12.5
model_year origin name
0 70 usa chevrolet chevelle malibu
1 70 usa buick skylark 320
2 70 usa plymouth satellite
3 70 usa amc rebel sst
4 70 usa ford torino
.. ... ... ...
397 82 usa chevy s-10
71 72 japan mazda rx2 coupe
111 73 japan maxda rx3
243 77 japan mazda rx-4
334 80 japan mazda rx-7 gs
[398 rows x 9 columns]
확인해보면 cylinders가 내림차순으로 정렬되었고, 결측치는 확인되지 않는다. 이때 df
를 확인한다면 원래와 같은 것을 알 수 있다.
다시 이번에는 mpg 데이터셋을 1차적으로 cylinders를 기준으로 오름차순으로, 2차적으로 horsepower를 기준으로 내림차순으로 정렬하고, 결측치는 앞으로, 정렬 방식은 힙정렬, 인덱스로 바꾸고, 원본 데이터를 변형하겠다.
df.sort_values(by=["cylinders", "horsepower"], ascending=[True, False], kind="heapsort", na_position="first", ignore_index=True, inplace=True)
이제 df
를 프린트해보면 다음과 같다.
mpg cylinders displacement horsepower weight acceleration \
0 21.5 3 80.0 110.0 2720 13.5
1 23.7 3 70.0 100.0 2420 12.5
2 19.0 3 70.0 97.0 2330 13.5
3 18.0 3 70.0 90.0 2124 13.5
4 25.0 4 98.0 NaN 2046 19.0
.. ... ... ... ... ... ...
393 20.0 8 262.0 110.0 3221 13.5
394 17.0 8 260.0 110.0 4060 19.0
395 19.9 8 260.0 110.0 3365 15.5
396 26.6 8 350.0 105.0 3725 19.0
397 23.9 8 260.0 90.0 3420 22.2
model_year origin name
0 77 japan mazda rx-4
1 80 japan mazda rx-7 gs
2 72 japan mazda rx2 coupe
3 73 japan maxda rx3
4 71 usa ford pinto
.. ... ... ...
393 75 usa chevrolet monza 2+2
394 77 usa oldsmobile cutlass supreme
395 78 usa oldsmobile cutlass salon brougham
396 81 usa oldsmobile cutlass ls
397 79 usa oldsmobile cutlass salon brougham
[398 rows x 9 columns]
기대한 바와 같이 cylinders를 기준으로 오름차순으로 정렬되었고, cylinders가 같은 경우 horsepower를 기준으로 내림차순으로 정렬되었다. 인덱스 역시 새롭게 0부터 시작하여 설정되었고, 4번 행을 보니 NaN
이 있는 걸로 보아 결측값이 가장 앞으로 배치되었다.
인덱스를 기준으로 데이터프레임 정렬
• sort_index 메소드
sort_index
(참고링크)를 이용하여 데이터프레임의 인덱스를 기준으로 정렬할 수 있다. sort_values
와 마찬가지로 기본적으로 정렬된 데이터를 반환한다.
여러가지 매개변수가 존재한다. axis
, ascending
, inplacse
, kind
, na_position
, ignore_index
, key
는 앞서 sort_valuse
와 같으니 앞선 내용을 참고하면 된다.
level
과 sort_remaining
은 다중 인덱스(MultiIndex)인 경우에 사용하는 매개변수로 일반적으로는 잘 사용하지 않는다.
주로 인덱스를 기준으로하는 정렬을 사용하는 이유는 데이터를 원본으로 돌리거나, 인덱스로 단순히 0, 1, ..., n이 들어가는 것이 아니라 인덱스로도 중요한 값, 예를 들어서 날짜, 시간 등의 데이터가 들어간 경우에 정렬할 때 사용한다.
• 예시
mpg 데이터셋을 df
변수에 저장하고, cylinders를 기준으로 원본을 정렬한다.
df.sort_values(by="cylinders", inplace=True)
그렇다면 df
는 다음과 같다.
mpg cylinders displacement horsepower weight acceleration \
111 18.0 3 70.0 90.0 2124 13.5
71 19.0 3 70.0 97.0 2330 13.5
334 23.7 3 70.0 100.0 2420 12.5
243 21.5 3 80.0 110.0 2720 13.5
267 27.5 4 134.0 95.0 2560 14.2
.. ... ... ... ... ... ...
86 14.0 8 304.0 150.0 3672 11.5
285 17.0 8 305.0 130.0 3840 15.4
286 17.6 8 302.0 129.0 3725 13.4
92 13.0 8 351.0 158.0 4363 13.0
0 18.0 8 307.0 130.0 3504 12.0
model_year origin name
111 73 japan maxda rx3
71 72 japan mazda rx2 coupe
334 80 japan mazda rx-7 gs
243 77 japan mazda rx-4
267 78 japan toyota corona
.. ... ... ...
86 73 usa amc matador
285 79 usa chevrolet caprice classic
286 79 usa ford ltd landau
92 73 usa ford ltd
0 70 usa chevrolet chevelle malibu
[398 rows x 9 columns]
인덱스가 바뀌었다. 이때 다시 인덱스를 기준으로 정렬해주자.
df.sort_index(inplace=True)
그렇다면 df
는 다음과 같다.
mpg cylinders displacement horsepower weight acceleration \
0 18.0 8 307.0 130.0 3504 12.0
1 15.0 8 350.0 165.0 3693 11.5
2 18.0 8 318.0 150.0 3436 11.0
3 16.0 8 304.0 150.0 3433 12.0
4 17.0 8 302.0 140.0 3449 10.5
.. ... ... ... ... ... ...
393 27.0 4 140.0 86.0 2790 15.6
394 44.0 4 97.0 52.0 2130 24.6
395 32.0 4 135.0 84.0 2295 11.6
396 28.0 4 120.0 79.0 2625 18.6
397 31.0 4 119.0 82.0 2720 19.4
model_year origin name
0 70 usa chevrolet chevelle malibu
1 70 usa buick skylark 320
2 70 usa plymouth satellite
3 70 usa amc rebel sst
4 70 usa ford torino
.. ... ... ...
393 82 usa ford mustang gl
394 82 europe vw pickup
395 82 usa dodge rampage
396 82 usa ford ranger
397 82 usa chevy s-10
[398 rows x 9 columns]
원래의 데이터셋으로 돌아온 것을 확인할 수 있다.
'Data Science > Pandas' 카테고리의 다른 글
[Pandas] 데이터 연결(concatenate) 및 결합(merge), 그리고 간단 결합(join) (0) | 2024.12.30 |
---|---|
[Pandas] 판다스를 통한 데이터 시각화(data visualization) (0) | 2024.12.28 |
[Pandas] 데이터프레임 기초 통계량 확인 (0) | 2024.12.26 |
[Pandas] 데이터 정보 확인과 미리보기 및 결측치 확인과 처리 (0) | 2024.12.25 |
[Pandas] 판다스 csv, 엑셀(xlsx, xls) 불러오기 및 저장하기 (0) | 2024.12.25 |