Pandas 데이터프레임을 두 개 이상의 열 기준으로 정렬하는 방법 (Python 2.7)
예제:
import pandas as pd
# 데이터 생성
data = {'A': [1, 4, 2, 3], 'B': [3, 2, 1, 4], 'C': ['c', 'a', 'b', 'd']}
df = pd.DataFrame(data)
# 두 열 기준으로 오름차순 정렬
df_sorted = df.sort_values(by=['B', 'A'], ascending=[True, True])
# 출력
print(df_sorted)
결과:
A B C
0 2 1 b
1 3 2 a
2 4 2 c
3 1 4 d
위 코드에서 sort_values()
함수는 by
매개변수에 리스트 ['B', 'A']
를 전달합니다. 이는 먼저 'B' 열 기준으로 오름차순 정렬하고, 같은 'B' 값을 가진 행은 'A' 열 기준으로 오름차순 정렬하도록 지시합니다. ascending
매개변수는 각 열의 정렬 방향을 지정하는데, 기본값은 True
(오름차순)입니다.
여러 열 기준 정렬 시 주의 사항:
- 서로 다른 데이터 타입을 가진 열을 기준으로 정렬할 때는
na_position
매개변수를 사용하여 누락값 처리 방식을 지정해야 할 수도 있습니다. - 여러 열 기준으로 정렬하면 결과적으로 데이터의 순서가 크게 바뀔 수 있으므로 주의해야 합니다.
Pandas 데이터프레임을 두 개 이상의 열 기준으로 정렬하는 방법 (Python 2.7) - 예제 코드
import pandas as pd
# CSV 파일로부터 데이터 불러오기
data_path = "data.csv" # 실제 파일 경로로 변경
df = pd.read_csv(data_path)
두 개 이상의 열 기준으로 정렬하기
# 두 열 기준으로 오름차순 정렬
df_sorted = df.sort_values(by=['열1', '열2'], ascending=[True, True])
# 내림차순 정렬
df_sorted = df.sort_values(by=['열1', '열2'], ascending=[False, False])
# 특정 열 기준으로 오름차순, 다른 열 기준으로 내림차순 정렬
df_sorted = df.sort_values(by=['열1', '열2'], ascending=[True, False])
정렬 결과 확인
print(df_sorted)
원본 데이터프레임 수정하기
# 정렬 결과를 원본 데이터프레임에 반영
df = df_sorted.copy() # 복사본 생성
# inplace=True 옵션 사용 (주의: 원본 데이터프레임 수정됨)
df.sort_values(by=['열1', '열2'], ascending=[True, True], inplace=True)
예시:
import pandas as pd
# 데이터 생성
data = {'열1': [3, 5, 1, 6, 2], '열2': ['a', 'c', 'b', 'd', 'e'], '열3': [7, 4, 9, 8, 10]}
df = pd.DataFrame(data)
# 두 열 기준으로 오름차순 정렬
df_sorted = df.sort_values(by=['열2', '열1'], ascending=[True, True])
# 출력
print(df_sorted)
열1 열2 열3
1 1 b 9
2 2 e 10
0 3 a 7
4 5 c 4
3 6 d 8
설명:
- 예제 코드에서는 'data.csv'라는 가상의 CSV 파일을 사용합니다. 실제 사용 시에는 실제 파일 경로로 변경해야 합니다.
sort_values()
함수는by
매개변수에 정렬 기준으로 사용할 열 이름을 리스트로 전달합니다.ascending
매개변수는 각 열의 정렬 방향을 지정하며, 기본값은True
(오름차순)입니다.inplace=True
매개변수를True
로 설정하면 정렬 결과를 원본 데이터프레임에 반영합니다. 주의해서 사용해야 합니다.- 코드에서 보여준 예시는 두 열 기준으로 정렬하는 방법을 보여주지만, 동일한 방식으로 3개 이상의 열 기준으로도 정렬할 수 있습니다.
Pandas 데이터프레임을 두 개 이상의 열 기준으로 정렬하는 방법 (Python 2.7) - 대체 방법
loc 인덱서 사용:
# 두 열 기준으로 오름차순 정렬
df_sorted = df.loc[df['열1'].argsort()[df['열2'].argsort()]].reset_index(drop=True)
argsort()
함수는 각 열의 값을 기준으로 정렬된 인덱스를 반환합니다.- 첫 번째
argsort()
는 '열1' 열을 기준으로 정렬된 인덱스를 생성하고, 두 번째argsort()
는 이 인덱스를 사용하여 '열2' 열을 기준으로 다시 정렬된 인덱스를 생성합니다. loc
인덱서를 사용하여 정렬된 인덱스에 해당하는 행만 선택하고,reset_index()
함수를 사용하여 인덱스를 다시 설정합니다.
idxmin() 함수 사용:
# '열2' 열을 기준으로 최소값을 가진 행 그룹을 찾기
grouped = df.groupby('열1')['열2'].idxmin()
# 정렬된 인덱스를 사용하여 데이터프레임 정렬
df_sorted = df.loc[grouped].sort_index()
groupby()
함수를 사용하여 '열1' 열을 기준으로 데이터프레임을 그룹화합니다.idxmin()
함수는 각 그룹에서 '열2' 열의 최소값을 가진 행의 인덱스를 반환합니다.
Lambda 함수 사용:
# 두 열을 기준으로 정렬할 키 함수 정의
def sort_key(row):
return (row['열1'], row['열2'])
# lambda 함수를 사용하여 정렬
df_sorted = df.sort_values(by=sort_key)
sort_key
함수는 두 열 값을 튜플로 반환하는 lambda 함수입니다.sort_values()
함수에 lambda 함수를 전달하여 정렬 기준을 지정합니다.
어떤 방법을 사용할까요?
- 가장 간편하고 명확한 방법은
sort_values()
함수를 사용하는 것입니다. - 데이터프레임의 크기가 크고 성능이 중요한 경우
loc
인덱서 또는idxmin()
함수를 사용하는 것이 더 효율적일 수 있습니다. - 특수한 정렬 기준이 필요한 경우 lambda 함수를 사용하는 것이 유연합니다.
- 각 방법의 장단점과 성능 차이를 비교하기 위해서는 실제 데이터에 적용해 벤치마킹하는 것이 좋습니다.
python pandas python-2.7