기술스택을 쌓아보자/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
뚜둥!
반응형