달나라 노트

Python Pandas : clip (최대 최소값 제한하기) 본문

Python/Python Pandas

Python Pandas : clip (최대 최소값 제한하기)

CosmosProject 2026. 5. 12. 21:53
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 — 컬럼별로 다른 범위 적용

lowerupper에 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
반응형
Comments