Python Library/Pandas

[Pandas - Python] Detecting and Filtering Outliers (데이터 필터)

바보1 2022. 6. 14. 00:39

Detecting and Filtering Outliers

 

이번에는 특정 범위를 넘어가는 데이터를 추출해보겠습니다.

data = pd.DataFrame(np.random.randn(1000, 4))
data.describe()

	0		1		2		3
count	1000.000000	1000.000000	1000.000000	1000.000000
mean	-0.047439	0.046069	0.024366	-0.006350
std	0.997187	0.998359	1.008925	0.993665
min	-3.428254	-3.645860	-3.184377	-3.745356
25%	-0.743886	-0.599807	-0.612162	-0.697084
50%	-0.086309	0.043663	-0.013609	-0.026381
75%	0.624413	0.746527	0.690847	0.694459
max	3.366626	2.653656	3.525865	2.735527

이때 2번째 column에 대해서 절댓값이 3이 넘어가는 행을 추출해보겠습니다.

col = data[2]
col[np.abs(col) > 3]

55     3.260383
230   -3.056990
317   -3.184377
777    3.525865
Name: 2, dtype: float64

 

 

또한 특정 행에 있는 데이터 하나라도 절댓값이 3이 넘어가는 행을 추출하겠습니다.

data[(np.abs(data) > 3).any(1)]

	0		1		2		3
36	-2.315555	0.457246	-0.025907	-3.399312
55	0.050188	1.951312	3.260383	0.963301
131	0.146326	0.508391	-0.196713	-3.745356
230	-0.293333	-0.242459	-3.056990	1.918403
254	-3.428254	-0.296336	-0.439938	-0.867165
317	0.275144	1.179227	-3.184377	1.369891
539	-0.362528	-3.548824	1.553205	-2.186301
631	3.366626	-2.372214	0.851010	1.332846
777	-0.658090	-0.207434	3.525865	0.283070
798	0.599947	-3.645860	0.255475	-0.549574

 

 

만약 데이터의 절댓값이 3이 넘어간다면, 해당 값을 1(-1)(부호에 맞게) * 3을 곱하여 처리해보겠습니다.

data[np.abs(data) > 3] = np.sign(data) * 3
data.describe()

	0		1		2		3
count	1000.000000	1000.000000	1000.000000	1000.000000
mean	-0.047378	0.047263	0.023821	-0.005206
std	0.994634	0.994342	1.005685	0.989845
min	-3.000000	-3.000000	-3.000000	-3.000000
25%	-0.743886	-0.599807	-0.612162	-0.697084
50%	-0.086309	0.043663	-0.013609	-0.026381
75%	0.624413	0.746527	0.690847	0.694459
max	3.000000	2.653656	3.000000	2.735527

min, max가 최소 -3, 최대 3이 된 모습을 볼 수 있습니다.

1번 column은 3이 넘는 숫자가 없었나보네요.

 

np.sign(data).head()


	0	1	2	3
0	-1.0	1.0	-1.0	1.0
1	-1.0	1.0	-1.0	1.0
2	-1.0	-1.0	-1.0	-1.0
3	-1.0	1.0	1.0	-1.0
4	1.0	1.0	1.0	-1.0

data를 np.sign(data)하여 모두 부호화 한 데이터를 5개만 봤습니다.