pandas の clip で値の範囲を制限する

データの中に極端な外れ値が含まれていると、集計や可視化の結果が歪んでしまうことがあります。pandas の clip メソッドを使えば、値の上限と下限を指定してその範囲に収めることができます。

基本的な使い方

clip は指定した最小値(lower)と最大値(upper)の範囲に値を制限します。

import pandas as pd

df = pd.DataFrame({
    "name": ["Alice", "Bob", "Charlie", "Diana", "Eve"],
    "score": [85, -10, 150, 72, 101]
})

df["clipped"] = df["score"].clip(lower=0, upper=100)
print(df)

-10 は 0 に、150 と 101 は 100 に丸められます。0〜100 の範囲に収まるべきスコアから逸脱した値を補正するのに便利です。

lower だけ、upper だけを指定する

片方だけを指定することもできます。

df["no_negative"] = df["score"].clip(lower=0)
df["capped"] = df["score"].clip(upper=100)
clip(lower=0)

0 未満の値を 0 に切り上げる。負の値を許容しないデータに有用

clip(upper=100)

100 を超える値を 100 に切り下げる。上限があるデータに有用

DataFrame 全体に適用する

clip は DataFrame 全体にも適用できます。

df_num = pd.DataFrame({
    "math": [85, -5, 110, 72],
    "english": [92, 58, 150, -3],
    "science": [76, 38, 200, 82]
})

result = df_num.clip(lower=0, upper=100)
print(result)

全列の値が一括で 0〜100 の範囲に制限されます。列ごとに異なる範囲を設定したい場合は、列単位で clip を呼び出してください。

パーセンタイルで外れ値を処理する

実務では固定値ではなく、パーセンタイルに基づいて clip する方法もよく使われます。

lower = df["score"].quantile(0.05)
upper = df["score"].quantile(0.95)
df["winsorized"] = df["score"].clip(lower=lower, upper=upper)

5 パーセンタイルから 95 パーセンタイルの範囲に収めるこの手法は、ウィンソライズ(winsorization)と呼ばれます。外れ値を除外するのではなく、境界値に置き換えることでデータ数を減らさずに影響を抑えられるのが特徴です。

clip と他の手法との使い分け

外れ値の処理にはいくつかの選択肢があります。

clip値を上下限に丸める(データ数は減らない)
dropna + 条件外れ値を含む行を削除する(データ数が減る)
where / mask外れ値を NaN に置き換える(後で補間が必要)

データ数を維持したいなら clip、外れ値そのものを排除したいなら条件フィルタ、欠損値として後処理したいなら where と、目的に応じて使い分けるのがよいでしょう。

clip はシンプルなメソッドですが、データのクレンジングやモデルへの入力準備で頻繁に登場します。外れ値に引っ張られてグラフが見にくくなるといった問題も、clip 一発で解消できるケースが多いので覚えておくと重宝します。