일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- django
- PostgreSQL
- Tkinter
- hive
- PANDAS
- Kotlin
- Google Spreadsheet
- PySpark
- string
- gas
- array
- Github
- google apps script
- 파이썬
- SQL
- math
- Python
- numpy
- Java
- c#
- Google Excel
- matplotlib
- Redshift
- Apache
- list
- dataframe
- Excel
- GIT
- Mac
- Today
- Total
달나라 노트
Python Pandas : sort_values (DataFrame의 정렬, DataFrame 정렬하기) 본문
Python Pandas : sort_values (DataFrame의 정렬, DataFrame 정렬하기)
CosmosProject 2021. 1. 6. 15:49
Pandas에선 DataFrame에 존재하는 Data를 정렬하기 위한 sort_values라는 함수를 제공합니다.
import pandas as pd
dict_test = {
'col1': [3, 1, 2, 3, 2, 1],
'col2': ['b', 'a', 'd', 'e', 'y', 'z']
}
df_test = pd.DataFrame(dict_test)
print(df_test)
print(type(df_test))
- Output
col1 col2
0 3 b
1 1 a
2 2 d
3 3 e
4 2 y
5 1 z
<class 'pandas.core.frame.DataFrame'>
먼저 테스트용 DataFrame을 만듭시다.
df_test_sorted = df_test.sort_values(by=['col1'], ascending=True)
print(df_test_sorted)
- Output
col1 col2
1 1 a
5 1 z
2 2 d
4 2 y
0 3 b
3 3 e
sort_values라는 함수를 DataFrame에 적용할 수 있습니다.
by라는 인자에 정렬의 기준이 될 column name을 전달합니다.
또한 ascending = True로 설정하게 되면 오름차순을 하라는 뜻입니다.(default 값은 ascending=True입니다.)
df_test_sorted = df_test.sort_values(by=['col1'], ascending=False)
print(df_test_sorted)
- Output
col1 col2
0 3 b
3 3 e
2 2 d
4 2 y
1 1 a
5 1 z
ascending=False로 설정하면 col1 기준 내림차순으로 설정되는걸 알 수 있습니다.
df_test_sorted = df_test.sort_values(by=['col1', 'col2'], ascending=True)
print(df_test_sorted)
- Output
col1 col2
1 1 a
5 1 z
2 2 d
4 2 y
0 3 b
3 3 e
df_test_sorted = df_test.sort_values(by=['col1', 'col2'], ascending=False)
print(df_test_sorted)
col1 col2
3 3 e
0 3 b
4 2 y
2 2 d
5 1 z
1 1 a
위 예시처럼 by 인자에 2개 이상의 column이름을 넣을 수 있습니다.
이 경우는 가장 첫 번째 명시된(가장 왼쪽의) column이 가장 나중에 정렬되며(가장 왼쪽 컬럼이 final 정렬 컬럼이 됩니다.) 가장 오른쪽에 명시된 column이 제일 먼저 정렬된다고 할 수 있습니다.
마치 엑셀에서 가장 오른쪽에 명시된 컬럼부터 정렬을 하기 시작해서 가장 왼쪽의 컬럼을 가장 나중에 정렬하는 결과와 동일합니다.
위 말을 좀 다르게 하면 가장 왼쪽에 적힌 컬럼일수록 더 높은 우선순위로 정렬되기 때문에 가장 나중에 정렬하는 효과를 가집니다.
df_test.sort_values(by=['col1', 'col2'], ascending=True, inplace=True, ignore_index=True)
print(df_test)
- Output
col1 col2
0 1 a
1 1 z
2 2 d
3 2 y
4 3 b
5 3 e
sort_values 함수에는 inplace라는 옵션과 ignore_index라는 옵션이 있습니다.
inplace=True 로 설정하면 sort_values가 적용되는 DataFrame 자체에 정렬을 적용합니다.
ignore_index=True로 설정하면 정렬을 한 후 index를 0부터 다시 매깁니다.
지금까지의 예시를 보면 정렬 후의 index가 0부터 차례대로 있지 않고 정렬 전의 index를 그대로 가져가는걸 볼 수 있습니다.
하지만 위 예시는 index가 0부터 1씩 증가하는 모습을 볼 수 있습니다.
만약 2개 이상의 컬럼을 기준으로 정렬을 할 것이고,
각 컬럼별로 오름차순으로 정렬할지 내림차순으로 정렬할지를 다 다르게 설정하고 싶으면 어떻게 해야할까요?
그에 대한 답이 아래 예시에 있습니다.
import pandas as pd
dict_test = {
'col1': [1, 1,
2, 2, 2,
3, 3, 3, 3, 3,
4, 4, 4,
5, 5, 5, 5],
'col2': [1000, 2000,
100, 300, 500,
200, 300, 100, 150, 180,
580, 200, 10,
100, 80, 55, 10]
}
df_test = pd.DataFrame(dict_test)
print(df_test)
df_test = df_test.sort_values(by=['col1', 'col2'],
ascending=[True, False],
ignore_index=True,
inplace=False)
print(df_test)
-- Result
col1 col2
0 1 2000
1 1 1000
2 2 500
3 2 300
4 2 100
5 3 300
6 3 200
7 3 180
8 3 150
9 3 100
10 4 580
11 4 200
12 4 10
13 5 100
14 5 80
15 5 55
16 5 10
결과를 보면 col1 기준으로는 오름차순이 되어있으며, col2 기준으로는 내림차순이 되어있습니다.
그래서 동일한 col1 값을 가진 행들에 대해서는 col2값이 내림차순으로 되어있죠.
df_test = df_test.sort_values(by=['col1', 'col2'],
ascending=[True, False],
ignore_index=True,
inplace=False)
sort_values() method를 사용한 부분을 보면 위와 같습니다.
by 인자에 정렬의 기준이 될 column 이름을 적어주었고,
ascending 인자에는 각 column별로 오름차순(True)을 할지 내림차순(False)을 할지를 list의 형태로 명시해줍니다.
이렇게 column별 오름차순/내림차순을 원하는대로 결정할 수 있습니다.
'Python > Python Pandas' 카테고리의 다른 글
Python Pandas : to_clipboard (DataFrame 복사하기) (0) | 2021.01.12 |
---|---|
Python Pandas : isin (각각의 요소가 DataFrame 또는 Series에 존재하는지 파악) (0) | 2021.01.07 |
Python Pandas : astype (DataFrame의 컬럼 Data type 바꾸기) & dtype(Series의 Data type 추출) (0) | 2021.01.06 |
Python Pandas : concat (Series 합치기, DataFrame 합치기) (0) | 2021.01.05 |
Python Pandas : value_counts (Series에 들어있는 값 개수 세기) (0) | 2021.01.05 |