Data Science/Pandas

Pandas. DataFrameGroupBy 객체 내용 확인

워로디스 2026. 8. 6. 22:48

DataFrameGroupBy 객체는 그대로 출력해도 내부 데이터가 보이지 않습니다.

grouped = df.groupby("지역")
print(grouped)
# <pandas.core.groupby.generic.DataFrameGroupBy object at ...>

대신 그룹 구조를 볼지, 각 그룹의 실제 데이터를 볼지, 집계 결과를 볼지에 따라 확인 방법을 선택하면 됩니다.

1. 그룹 이름과 행 위치 확인: .groups

grouped.groups

예를 들어:

{
    "부산": Index([2, 3], dtype="int64"),
    "서울": Index([0, 1], dtype="int64")
}

각 그룹에 어떤 원본 인덱스가 포함됐는지 확인할 수 있습니다.

그룹 키만 보고 싶다면:

grouped.groups.keys()
list(grouped.groups)

2. 각 그룹의 실제 데이터 확인: 반복문

가장 확실한 방법입니다.

for name, group in grouped:
    print("그룹:", name)
    print(group)

name은 그룹 키이고, group은 해당 그룹의 DataFrame입니다.

그룹이 너무 많을 때는 일부만 봅니다.

for i, (name, group) in enumerate(grouped):
    print("그룹:", name)
    print(group.head())

    if i == 2:
        break

3. 특정 그룹만 확인: .get_group()

grouped.get_group("서울")

여러 열을 기준으로 그룹화했다면 튜플을 사용합니다.

grouped = df.groupby(["지역", "상품"])

grouped.get_group(("서울", "A"))

실무에서 특정 그룹의 이상 데이터를 조사할 때 유용합니다.

4. 그룹별 행 개수 확인: .size()

그룹이 제대로 나뉘었는지 빠르게 확인하기 가장 좋은 방법 중 하나입니다.

grouped.size()

예:

지역
부산    2
서울    2
dtype: int64

결과를 일반적인 DataFrame으로 받고 싶다면:

grouped.size().reset_index(name="행개수")

size()는 결측값 여부와 관계없이 그룹의 전체 행 수를 셉니다.

5. 각 그룹의 앞부분 확인: .head()

grouped.head(2)

주의할 점은 그룹마다 앞의 2행을 반환하지만, 결과는 원본 DataFrame과 비슷한 형태라는 것입니다. 그룹별로 구분되어 출력되지는 않습니다.

그룹별 첫 행만 확인하려면:

grouped.first()

하지만 first()는 열별 첫 번째 결측값이 아닌 값을 선택할 수 있으므로, 실제 첫 번째 행과는 차이가 날 수 있습니다.

실제 각 그룹의 첫 번째 행을 원한다면:

grouped.nth(0)

또는:

grouped.head(1)

6. 그룹별 요약 통계 확인: .agg() 또는 .describe()

숫자형 열을 빠르게 점검하려면:

grouped["매출"].agg(["count", "sum", "mean", "min", "max"])

전체 기술통계는:

grouped["매출"].describe()

여러 열을 각각 다르게 집계할 수도 있습니다.

grouped.agg(
    매출합계=("매출", "sum"),
    평균수량=("수량", "mean"),
    행개수=("매출", "size")
)

7. GroupBy 객체의 주요 속성 확인

grouped.ngroups

전체 그룹 개수를 반환합니다.

grouped.indices

.groups와 비슷하지만, 그룹별 위치를 NumPy 배열 형태로 제공합니다.

grouped.obj

그룹화하기 전의 원본 DataFrame을 확인합니다.

grouped.grouper

내부 그룹화 정보를 볼 수 있지만, 일반적인 분석에서는 자주 쓸 필요가 없습니다. 또한 pandas 버전에 따라 내부 API는 변경될 수 있으므로 디버깅 외에는 의존하지 않는 편이 좋습니다.

추천 확인 순서

실무에서는 대개 아래 순서로 확인하면 충분합니다.

grouped = df.groupby("지역")

# 1. 그룹 수
print(grouped.ngroups)

# 2. 그룹별 데이터 개수
print(grouped.size())

# 3. 그룹 이름
print(list(grouped.groups))

# 4. 특정 그룹 확인
print(grouped.get_group("서울"))

# 5. 그룹별 일부 데이터 확인
for name, group in grouped:
    print(name)
    print(group.head(2))

핵심적으로는 다음 세 가지를 가장 많이 사용합니다.

확인 목적 방법
그룹별 행 개수 grouped.size()
특정 그룹의 데이터 grouped.get_group(key)
모든 그룹의 실제 내용 for name, group in grouped

단순히 객체 내부를 살펴보는 목적이라면 size()와 반복문 조합이 가장 이해하기 쉽습니다.

반응형