반응형
Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | |||||
| 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 10 | 11 | 12 | 13 | 14 | 15 | 16 |
| 17 | 18 | 19 | 20 | 21 | 22 | 23 |
| 24 | 25 | 26 | 27 | 28 | 29 | 30 |
| 31 |
Tags
- matplotlib
- math
- Tkinter
- Kotlin
- Excel
- hive
- Python
- Redshift
- PySpark
- gas
- Github
- string
- numpy
- PANDAS
- Mac
- django
- PostgreSQL
- array
- 파이썬
- google apps script
- list
- Google Spreadsheet
- Java
- Google Excel
- GIT
- dataframe
- Apache
- SQL
- c#
Archives
- Today
- Total
달나라 노트
Python Pandas : clip (최대 최소값 제한하기) 본문
728x90
반응형
Pandas clip() — 값의 범위를 딱 잘라내는 메서드
비유로 먼저 이해하기
음량 조절기를 생각해보세요.
볼륨은 0 이하로 내려가지 않고, 100 이상으로 올라가지 않죠.
아무리 큰 값을 넣어도 100에서 멈추고, 음수가 되어도 0에서 멈춥니다.
clip()이 바로 그 역할입니다.
"이 범위 안에서만 살아남아라" — 벗어난 값은 경계값으로 잘라냅니다.
기본 문법
Series.clip(lower=None, upper=None)
DataFrame.clip(lower=None, upper=None)
| 파라미터 | 설명 |
|---|---|
lower |
이 값보다 작으면 lower로 대체 |
upper |
이 값보다 크면 upper로 대체 |
예시 1 — Series 기본
시험 점수를 생각해봅시다. 점수는 0점 미만이 될 수 없고 100점을 초과할 수도 없습니다.
import pandas as pd
scores = pd.Series([-10, 45, 78, 105, 99])
# 0 -10
# 1 45
# 2 78
# 3 105
# 4 99
clipped = scores.clip(lower=0, upper=100)
# 0 0 ← -10이 0으로 올라옴
# 1 45
# 2 78
# 3 100 ← 105가 100으로 내려옴
# 4 99
예시 2 — 이상치(Outlier) 처리
실무에서 가장 많이 쓰는 용도입니다.
데이터에 이상하게 크거나 작은 값이 있을 때 분위수(quantile) 기준으로 잘라냅니다.
import pandas as pd
# 연봉 데이터 (단위: 만원)
salary = pd.Series([2800, 3100, 2900, 50000, 3200, 100, 3050])
lower = salary.quantile(0.05) # 하위 5%
upper = salary.quantile(0.95) # 상위 5%
clean = salary.clip(lower=lower, upper=upper)
# 50000(너무 큰 값)과 100(너무 작은 값)이 경계값으로 조정됩니다
팁:
clip()은 값을 제거하지 않고 경계값으로 대체합니다. 행 수가 유지된다는 점이 dropna()나 필터링과 다릅니다.예시 3 — DataFrame 전체에 적용
import pandas as pd
df = pd.DataFrame({
'국어': [55, 102, -3, 88],
'수학': [70, 95, 110, -5],
})
# 국어 수학
# 0 55 70
# 1 102 95
# 2 -3 110
# 3 88 -5
result = df.clip(lower=0, upper=100)
# 국어 수학
# 0 55 70
# 1 100 95 ← 102 → 100
# 2 0 100 ← -3 → 0, 110 → 100
# 3 88 0 ← -5 → 0
예시 4 — 컬럼별로 다른 범위 적용
lower와 upper에 Series를 넘기면 컬럼마다 다른 범위를 쓸 수 있습니다.
import pandas as pd
df = pd.DataFrame({
'온도': [-5, 15, 42, 38],
'습도': [10, 55, 110, -2],
})
lower = pd.Series({'온도': 0, '습도': 0})
upper = pd.Series({'온도': 40, '습도': 100})
result = df.clip(lower, upper, axis='columns')
# 온도 습도
# 0 0 10 ← 온도 -5 → 0
# 1 15 55
# 2 40 100 ← 온도 42 → 40, 습도 110 → 100
# 3 38 0 ← 습도 -2 → 0
clip() vs 직접 필터링
아래 두 코드는 같은 결과지만, clip()이 훨씬 깔끔합니다.
# 직접 필터링 (verbose)
s = s.where(s >= 0, 0)
s = s.where(s <= 100, 100)
# clip 사용 (clean)
s = s.clip(0, 100)
정리
| 상황 | 코드 |
|---|---|
| 값을 0~100 사이로 제한 | df.clip(0, 100) |
| 하한선만 설정 (음수 제거) | df.clip(lower=0) |
| 상한선만 설정 | df.clip(upper=100) |
| 이상치를 분위수로 처리 | df.clip(df.quantile(0.05), df.quantile(0.95)) |
| 컬럼별 다른 범위 | df.clip(lower_series, upper_series, axis='columns') |
clip()은 단순하지만 이상치 처리, 점수 정규화, 센서 데이터 보정 등 다양한 곳에서 쓸 수 있는 실용적인 메서드입니다.
728x90
반응형
'Python > Python Pandas' 카테고리의 다른 글
Comments
