[Python pandas] DataFrame을 정렬한 후에, 그룹별로 상위 N개 행 선택하기 (sort DataFrame by value and select top N rows by group)
Python 분석과 프로그래밍/Python 데이터 전처리 2019. 7. 13. 20:20이번 포스팅에서는 Python pandas의 DataFrame을
(1) 특정 칼럼을 기준으로 행을 정렬한 후에 (sort DataFrame by value in ascending/descending order)
==> (2) 각 그룹별로 상위 N개 행을 가져오기 (select top N rows by group)
을 하는 방법을 소개하겠습니다.
먼저 'a'와 'b' 두 개의 그룹별로 5개의 값을 가진 간단한 예제 DataFrame을 만들어보겠습니다.
import numpy as np import pandas as pd # make a sample DataFrame df = pd.DataFrame({'grp': ["a", "a", "a", "a", "a", "b", "b", "b", "b", "b"], 'val': np.random.uniform(0, 10, 10)}) df
|
이제 "val" 변수를 기준으로 내림차순 정렬(sort by 'val' in descending order) 한 후에, 'grp' 칼럼의 'a', 'b' 그룹별로 상위 3개의 값을 가져와서 새로운 데이터프레임을 만들어보겠습니다.
# sort by value in descending order per group, and select top 3 values per group df_sort_group_top3 = df.sort_values(by="val", ascending=False).groupby("grp").head(3) df_sort_group_top3
|
위의 df_sort_group_top3 결과를 좀더 보기에 좋도록 'a', 'b' 그룹 순서대로, 각 그룹 내에서는 내림차순으로 정렬해보겠습니다.
df_sort_group_top3.sort_values(by=["grp", "val"], ascending=[True, False])
|
사용자 정의함수를 작성하고 df.groupby("grp").apply(UDF) 를 사용하는 방법도 있습니다. apply(UDF_name, arguments) 형식으로 사용자 정의 함수에서 사용했던 매개변수를 같이 넣어주면 됩니다. 매개변수 값을 변경해서 여러번 사용해야 하는 경우에는 아래처럼 사용자 정의 함수를 사용하는게 아무래도 편리하고 코드도 깔끔하겠습니다.
(물론, 아래의 예의 경우 사용자 정의함수에서 default 값으로 입력해놓은 매개변수 값과 동일하기 때문에 apply(top) 만 해도 결과는 동일합니다.)
def top(df, n=3, column='val'): return df.sort_values(by="val", ascending=False)[:n]
df.groupby("grp").apply(top, column="val", n=3)
|
정렬하는 칼럼이나 Top N개가 고정되어 있거나 일회성인 경우에는 간단하게 lambda 를 사용해서 사용자 정의 함수를 정의해서 사용해도 되겠습니다.
top2 = lambda x: x.sort_values(by='val', ascending=False)[:3] df.groupby('grp').apply(top2)
|
많은 도움이 되었기를 바랍니다.
'Python 분석과 프로그래밍 > Python 데이터 전처리' 카테고리의 다른 글
[Python] itertools를 활용한 리스트 원소를 n번 반복하여 새로운 리스트 만들기 (0) | 2019.07.21 |
---|---|
[Python pandas] DataFrame index를 reset칼럼으로 가져오고 이름 부여하기 (0) | 2019.07.13 |
[Python pandas] pivot_table() 할 때 DataError: No numeric types to aggregate 에러 대처방법 aggfunc='first' (0) | 2019.07.11 |
[Python pandas] DataFrame, Series의 행, 열 개수 세기 (1) | 2019.07.03 |
[Python pandas] DataFrame의 문자열 칼럼을 분할하여 일부분으로 새로운 칼럼 만들기 (2) | 2019.07.01 |