기술스택을 쌓아보자/Python

[조각 pandas] nsmallest, nlargest, serise.quantile로 상위 및 하위 n 개 n% 값 가져오기(각각 행과 열에서 )

소리331 2022. 6. 10. 13:33
반응형

nsmallest(), nlargest() => 칼럼을 기준으로 상위 N개

열을 기준으로 상위 n 개의 값을 가져올 때 쓴다. 첫번째 인자는 가져오려는 개수, 두번째 인자는 기준이 되는 칼럼.

df.nsmallest(3, 'population')
          population    GDP alpha-2
Tuvalu         11300     38      TV
Anguilla       11300    311      AI
Iceland       337000  17036      IS

추가적으로 keep을 설정할 수 있는데, 만약 3등인 것이 여러개인 경우 처리 방법을 의미한다

  • first: 가장먼저나온 값을 3등으로처리
  • last: 가장 마지막 행을 3등으로 처리
  • all: 놓치는 것없이 모두 다 출력

 

Series.quantile()

df[df.a < df.a.quantile(.95)]

이렇게하면 내가 원하는 분위에서 출력할 수 있다!

 


 

그런데 사실 난 이게 궁금한게 아니라,

시계열 데이터에서 일자별로 보았을 때 상위 N%의 값만 데이터 프레임에 남겨주고 싶었다.

시계열에서 일자별로 상위 n%의 값만 가지고 있는 df 만들기

내가 가진 df 의 조건은 다음과 같다.

  • 사이즈가 엄청 크다.
  • 한 행에 nan 값이 많다 ( 이를 다 제외한 값에서 n%를 구해야한다)
  • 행을 기준으로 n%를 구하고, 그 외는 다 Nan처리한다.

그래서 아래와 같이 짜보았다.

import pandas as pd 
import numpy as np

df = pd.DataFrame([[1,2,3,4,np.nan], [1,5,3,4,np.nan], [1,2,6,4,np.nan]], index=["2022-01-01", "2022-01-02", "2022-01-03"])
df.index = pd.to_datetime(df.index)
df
Out[12]: 
            0  1  2  3   4
2022-01-01  1  2  3  4 NaN
2022-01-02  1  5  3  4 NaN
2022-01-03  1  2  6  4 NaN

먼저 샘플을 짜보았다. 우리는 위의 df를 바탕으로 상위 20%에 해당하는 값들을 제외하고 전부 nan처리 할 것이다. 그러면 내가 원하는 결과물은 4, 5, 6 이 잘 출력되고 나머지가 nan 처리되는 것!

df.apply(
    lambda x: x[x > x.quantile(.8)],
    axis=1
)
Out[22]: 
              1    2    3
2022-01-01  NaN  NaN  4.0
2022-01-02  5.0  NaN  NaN
2022-01-03  NaN  6.0  NaN

 

뚜둥!

반응형