pandas groupby에서 실제 데이터에 나타난 그룹만 필요하면 observed=True를, 미관측 카테고리까지 결과에 포함해야 하면 observed=False를 선택합니다. 이 옵션은 Categorical 그룹 키에 적용됩니다. 결측값인 NA를 그룹에 포함할지는 별도 옵션인 dropna로 정합니다.
observed가 바꾸는 범위
Categorical은 등록된 categories와 데이터에 실제로 나타난 값을 따로 가집니다. observed=True는 실제로 관측된 그룹을 표시하고, observed=False는 미관측 카테고리나 조합도 포함할 수 있습니다. 일반 문자열 열에 없는 값을 observed만으로 새로 만드는 옵션은 아닙니다. pandas DataFrame.groupby 공식 문서와 Categorical 공식 가이드에서 적용 범위를 확인할 수 있습니다.
공식 문서 기준으로 pandas 3.0.0부터 DataFrame.groupby의 observed 기본값은 True입니다. 버전이 바뀐 뒤 결과 행 수가 달라졌다면 실행 환경의 pandas 버전과 코드에서 옵션을 명시했는지 함께 확인해 보세요. observed 관련 FutureWarning이 나타나는 경우에도 메시지만 숨기기보다 필요한 결과 그룹을 먼저 정하는 것이 좋습니다. 모든 버전에서 경고가 발생한다고 가정할 필요는 없습니다.
원하는 결과 그룹으로 선택하기
| 필요한 결과 | 설정 | 확인할 점 |
|---|---|---|
| 실제 데이터에 나타난 그룹만 | observed=True |
입력의 관측된 조합과 결과가 맞는지 |
| 등록된 카테고리의 미관측 조합도 포함 | observed=False |
빈 조합을 보고서에서 어떻게 해석할지 |
미관측 그룹의 집계값은 집계 함수에 따라 0이나 NaN 등으로 달라질 수 있습니다. 숫자가 0이라고 해서 그 원인이나 업무상 의미까지 자동으로 결정되는 것은 아닙니다. 전체 기준표가 필요할 때도 실제 결과가 필요한 조합을 담는지 확인하세요.
작은 예제로 결과 비교하기
다음은 설명을 위한 예제입니다. 제시된 값과 결과는 운영 데이터의 측정 결과가 아닙니다. 설치된 pandas 환경에서 실행해 비교할 수 있습니다.
import pandas as pd
df = pd.DataFrame(
{
"region": pd.Categorical(
["서울", "서울", "부산"], categories=["서울", "부산", "대전"]
),
"status": pd.Categorical(
["완료", "대기", "완료"], categories=["완료", "대기", "취소"]
),
"count": [2, 1, 3],
}
)
for observed in (True, False):
result = df.groupby(["region", "status"], observed=observed)["count"].sum()
print(f"observed={observed}\n{result}")
예상 결과에서 observed=True는 서울·완료 2, 서울·대기 1, 부산·완료 3인 관측 조합만 표시합니다. observed=False는 등록된 지역과 상태의 조합을 포함하며, 이 sum 예제의 미관측 조합은 0으로 표시됩니다. 출력 순서나 형식은 환경에 따라 확인하세요. 이 동작의 근거는 pandas groupby 사용자 가이드와 과거 버전의 categorical groupby 예시입니다. 다른 집계 함수까지 같은 값으로 나온다고 일반화하지 마세요.
빈 카테고리와 NA 그룹은 따로 확인합니다
미관측 카테고리는 categories에 등록됐지만 입력에 나타나지 않은 값입니다. NA는 그룹 키의 결측값입니다. observed=False가 NA 포함 여부를 대신 정하지는 않습니다. 기본 dropna=True는 NA 그룹을 제외하며, 포함하려면 dropna=False를 명시합니다. 자세한 내용은 DataFrame.groupby 공식 문서를 확인하세요.
by_region = df.groupby("region", observed=True, dropna=False)["count"].sum()
위 예제 입력에는 NA가 없으므로 이 코드만으로 NA 그룹이 나타나는 것은 아닙니다. 실제 입력에 결측 그룹 키가 있을 때 해당 그룹이 필요한지 확인하고 결과를 검증하세요.
결과를 점검할 때는 등록된 categories, 입력에 실제로 등장한 그룹 조합, 결과의 행과 NA 그룹 포함 여부를 나눠 비교하면 됩니다. 여러 Categorical 키를 묶었다면 각 열의 값뿐 아니라 조합을 비교해야 합니다. 실행 환경의 pandas 버전과 observed, dropna 설정도 함께 확인해 두세요.
실제 관측 그룹만 필요한지, 미관측 카테고리를 포함한 표가 필요한지에 따라 observed를 명시하고, 빈 값과 NA의 의미는 각각 정하는 것이 핵심입니다. 다음으로 빈 카테고리를 보고서에 0으로 표시할지와 NA 그룹을 별도로 보여줄지를 판단하면 됩니다.