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가 같은 너비의 경계값을 계산하는 경우에도 같은 방식을 사용할 수 있습니다. 경계값을 확인하거나 재사용하려면 반환된 값을 보관하세요.