본문 바로가기
판다스/판다스 팁

[pandas] 정렬시 매개 변수 key에 열마다 다른 함수 할당하기

by 김판다t 2024. 3. 29.

예제

import pandas as pd
data1 = {'col1': ['b', 'a', 'B', 'c', 'a', 'a', 'a', 'B'], 
         'col2': ['ab', 'abc', 'aa', 'abcd', 'bbb', 'a', 'b', 'c'], 
         'col3': [7, 9, 2, 2, 2, 6, 7, 9]}

df = pd.DataFrame(data1)

 

df:

 

col1은 대소문자를 가리지 않고 정렬하고,

col2는 글자수에 따라 정렬하고,

col3는 숫자에 따라 오름차순으로 정렬합니다.

 

정렬의 순서는 col1 col2 col3 열의 순서입니다.

 

 

물론 정렬용 열을 만들어 정렬을 수행 뒤 삭제를 할 수 있습니다.

out = (df
       .assign(col4=df['col1'].str.lower(), col5=df['col2'].str.len())
       .sort_values(['col4', 'col5', 'col3'])
       .drop(['col4', 'col5'], axis=1)
)
out

 

 

보다 세련된 방법은 sort_values 함수에 매개변수 key로 정렬용 함수를 전달하는 것인데, 결국 sort_values의 key에 열마다 다른 함수를 적용해야 합니다.

 

매개변수 key에 열마다 다른 함수를 전달하는 방법은 아래와 같습니다.

def sorter(x):
    return {
      'col1': lambda s: s.str.lower(),
      'col2': lambda s: s.str.len()
    }.get(x.name, lambda s: s)(x)


out = df.sort_values(['col1', 'col2', 'col3'], key=sorter)

 

out:

 

위 코드를 딕셔너리로 풀어 쓰면 다음과 같습니다.

m = {'col1': lambda s: s.str.lower(), 'col2': lambda s: s.str.len()}
out = df.sort_values(['col1', 'col2', 'col3'], key=lambda x: m.get(x.name, lambda s: s)(x))

 


 

교보문고 구매 페이지, 알라딘 구매 페이지yes24 구매 페이지