API · Pandas

Pandas cut 기능

이 튜토리얼에서는 pandas.cut() 함수로 데이터를 범위, 즉 bin에 할당하는 방법을 설명합니다.

이 페이지의 내용

pandas.cut() 함수는 숫자 값을 범위, 즉 bin에 할당합니다. 입력값마다 해당하는 구간 범주 하나를 반환하므로 나이나 점수 같은 연속 측정값을 분석용 그룹으로 바꿀 때 유용합니다. 경계값을 직접 지정하거나 pandas가 범위를 원하는 개수의 구간으로 나누도록 할 수 있습니다.

구문, 매개변수 및 반환값

함수 호출 형식은 pandas.cut(x, bins, right=True, labels=None, retbins=False, precision=3, include_lowest=False, duplicates="raise", ordered=True)입니다.

자주 사용하는 인수는 다음과 같습니다.

매개변수 설명
x 할당할 숫자형 배열 유사 값입니다. 리스트, Series 또는 DataFrame 열 등을 사용할 수 있습니다.
bins 너비가 같은 구간의 개수를 나타내는 정수, 명시적인 경계값 시퀀스 또는 IntervalIndex입니다. 정수를 지정하면 pandas가 x의 최솟값과 최댓값으로 범위를 정하고, 그 범위를 같은 너비의 구간으로 나눕니다. 양 끝의 값을 모두 포함하도록 범위를 양쪽으로 0.1%씩 확장합니다. 시퀀스를 지정하면 경계값을 그대로 사용하며, 정수 구간에 적용되는 이 범위 조정은 하지 않습니다.
right 기본값인 True에서는 구간에 오른쪽 끝점이 포함됩니다. False로 설정하면 왼쪽 끝점을 포함하는 구간을 사용합니다.
labels 각 구간에 붙일 선택적 레이블입니다. False를 지정하면 정수 구간 위치를 반환합니다.
retbins True로 설정하면 구간을 만드는 데 사용한 경계값도 반환합니다.
precision 경계값을 저장하고 표시할 때 사용하는 정밀도입니다.
include_lowest True로 설정하면 가장 낮은 경계값을 첫 번째 구간에 포함합니다.
duplicates 경계값에 중복이 있을 때 "raise"(기본값) 또는 "drop"을 선택합니다.
ordered 반환되는 범주에 순서를 부여할지 여부입니다. 기본값은 True입니다.

일반적으로 결과에는 x의 각 항목에 대응하는 범주값이 하나씩 들어갑니다. 어떤 구간에도 속하지 않는 값은 NaN으로 표시됩니다. retbins=True이면 값별 결과와 경계값 배열로 이루어진 쌍을 반환합니다.

DataFrame 값을 구간에 할당하기

DataFrame 열을 x로 전달하고, bins에 구간 경계값을 지정한 다음, 반환된 Series를 새 열에 할당합니다. 아래 예제를 살펴보세요. 코드와 출력은 바이트 단위로 보존되므로 출력에는 Age와 Age-Range 열이 표시됩니다. Initial DataFrame:이나 DataFrame with Age-Range: 같은 레이블은 코드가 출력하지 않습니다.

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

import pandas as pd

df = pd.DataFrame(
    {
        "Name": ["Anish", "Birat", "Chirag", "Kabin", "Sachin"],
        "Age": [23, 34, 38, 45, 27],
        "Score": [316, 322, 332, 330, 325],
    }
)

df["Age-Range"] = pd.cut(df["Age"], bins=[20, 30, 40, 50])
print(df[["Age", "Age-Range"]].to_string(index=False))

경계값 네 개가 구간 세 개를 정의하므로 결과에는 구간이 세 개 있습니다. 각 행은 원래 위치를 유지하며, Age-Range 값으로 해당 행의 나이가 속하는 구간을 확인할 수 있습니다. 예를 들어 나이 23은 (20, 30]에, 나이 45는 기본 구간 규칙에 따라 (40, 50]에 속합니다.

구간 경계 제어하기

기본 설정인 right=True는 오른쪽 끝점을 포함하는 구간을 만듭니다. (20, 30] 표기는 20보다 크고 30 이하인 값을 뜻합니다. 즉 20은 제외되고 30은 포함됩니다. include_lowest=True를 설정하면 가장 낮은 경계값도 첫 번째 구간에 포함됩니다. right=False로 설정하면 [20, 30)처럼 왼쪽 끝점은 포함하고 오른쪽 끝점은 제외하는 구간을 사용합니다. 이 설정에서는 가장 높은 경계값이 마지막 구간에 포함되지 않습니다. 어떤 구간에도 해당하지 않는 값은 NaN으로 반환됩니다.

다음 예제는 지정한 경계값과 같거나 그 사이에 있는 나이를 대상으로 각 옵션을 비교합니다. 코드와 출력은 바이트 단위로 보존되며, 출력 열 이름은 Age, default, include_lowest, left_closed입니다.

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

import pandas as pd

ages = pd.Series([20, 23, 30, 45, 50], name="Age")
result = pd.DataFrame(
    {
        "Age": ages,
        "default": pd.cut(ages, bins=[20, 30, 40, 50]),
        "include_lowest": pd.cut(
            ages, bins=[20, 30, 40, 50], include_lowest=True
        ),
        "left_closed": pd.cut(
            ages, bins=[20, 30, 40, 50], right=False
        ),
    }
)
print(result.to_string(index=False))

20과 50에 해당하는 행을 비교하면 끝점 설정에 따라 구간 포함 여부가 어떻게 달라지는지 알 수 있습니다. 기본 설정에서는 50이 마지막 구간에 포함되지만 20은 첫 번째 구간에서 제외됩니다. include_lowest=True는 20을 첫 번째 구간에 포함하고, right=False는 20을 포함하는 대신 50을 마지막 구간에서 제외합니다.

구간에 레이블 지정하기

구간 표기 대신 읽기 쉬운 범주 이름을 표시하려면 각 구간에 사용할 레이블을 전달합니다. 레이블은 구간 순서대로 대응하므로 구간이 세 개라면 레이블도 세 개가 필요합니다. 코드와 출력은 바이트 단위로 보존되므로 범주 레이블 21 to 30, 31 to 40, 41 to 50은 영어로 표시됩니다.

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

import pandas as pd

ages = pd.Series([23, 34, 38, 45, 27], name="Age")
labels = ["21 to 30", "31 to 40", "41 to 50"]
age_groups = pd.cut(
    ages,
    bins=[20, 30, 40, 50],
    labels=labels,
)
print(age_groups.to_string(index=False))

기본 설정에서는 첫 번째 레이블이 (20, 30], 두 번째가 (30, 40], 세 번째가 (40, 50]에 해당합니다. 이름 대신 숫자로 된 그룹 위치가 필요하면 labels=False를 전달하세요. 그러면 pandas는 구간에 할당된 값에 정수 구간 코드를 반환합니다.

retbins=True로 구간 경계값 반환하기

값별 범주와 해당 범주에 사용된 경계값을 모두 얻으려면 retbins=True로 설정합니다. 반환된 첫 번째 항목은 x에 대응하는 결과이고, 두 번째 항목은 여러 값에 함께 적용되는 구간 경계 배열입니다. 다음 예제에서는 두 항목을 각각 변수에 할당합니다. 코드와 출력은 바이트 단위로 보존되며, 출력 레이블 Groups:와 Bin edges:는 영어로 표시됩니다.

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

import pandas as pd

ages = pd.Series([23, 34, 38, 45, 27], name="Age")
age_groups, bin_edges = pd.cut(
    ages,
    bins=[20, 30, 40, 50],
    labels=["21 to 30", "31 to 40", "41 to 50"],
    retbins=True,
)
print("Groups:")
print(age_groups.to_string(index=False))
print("Bin edges:")
print(bin_edges)

age_groups에는 각 나이에 대응하는 레이블이 붙은 결과가 하나씩 들어 있고, bin_edges에는 [20, 30, 40, 50]이 들어 있습니다. bins에 정수를 지정해 pandas가 같은 너비의 경계값을 계산하는 경우에도 같은 방식을 사용할 수 있습니다. 경계값을 확인하거나 재사용하려면 반환된 값을 보관하세요.