HOWTO · Pandas
Pandas Groupby 2 열
이 튜토리얼은 Pandas에서 DataFrame을 그룹으로 분리하기 위해 두 개의 열에 대해 DataFrame.groupby() 메서드를 사용하는 방법을 설명합니다.
이 페이지의 내용
두 열을 기준으로 행을 그룹화하려면 열 이름을 리스트로 만들어 DataFrame.groupby()에 전달합니다. 서로 다른 값의 조합마다 하나의 그룹이 만들어집니다. 아래 예제에서는 6행짜리 DataFrame 하나를 사용해 그룹을 확인하고, 각 그룹의 행 수를 세며, 고용 여부별로 가장 큰 하위 그룹을 찾습니다. pandas가 설치된 환경에서 실행할 수 있습니다. 여기서는 실행 결과를 제시하지 않습니다.
DataFrame을 두 열 기준으로 그룹화하기
['Gender', 'Employed'] 리스트는 pandas가 두 열을 함께 기준으로 그룹화하도록 지정합니다. 예를 들어 한 행의 두 값이 모두 일치해야 Female/Yes 그룹에 포함됩니다. 전체 스크립트는 독립적으로 실행할 수 있으며, 뒤의 각 단계에서도 같은 데이터를 사용합니다. 코드가 표시하는 그룹과 행 수의 레이블은 바이트 동일성 규칙에 따라 영어로 유지됩니다.
import pandas as pd
data = pd.DataFrame(
{
"Name": ["Jennifer", "Travis", "Bob", "Emma", "Luna", "Anish"],
"Gender": ["Female", "Male", "Male", "Female", "Female", "Male"],
"Employed": ["Yes", "No", "Yes", "No", "Yes", "No"],
"Age": [30, 28, 27, 24, 28, 25],
}
)
groups = data.groupby(["Gender", "Employed"])
print("Groups:")
for group_key, group_rows in groups:
print(f"{group_key}: {len(group_rows)} rows")
counts = groups.size().reset_index(name="Count")
print("\nRows per pair:")
print(counts.to_string(index=False))
largest = groups.size().groupby(level="Employed").max()
print("\nLargest subgroup per employment value:")
print(largest.to_string())
만들어진 그룹 순회하기
groups를 순회하면 관찰된 각 조합에 대해 (group_key, group_rows) 쌍이 반환됩니다. 여기서 group_key에는 Gender와 Employed 값이 이 순서대로 들어 있고, group_rows는 조건에 맞는 원본 행을 담은 DataFrame입니다. 반환된 DataFrame을 바로 사용하면 됩니다. get_group()으로 다시 가져오면 같은 조회를 반복하게 됩니다. 기본적으로 pandas는 그룹이 입력에서 처음 나타난 순서를 유지하지 않고 그룹 키를 정렬합니다. 각 그룹 안의 행은 원래 상대적 순서를 유지합니다.
각 그룹의 행 수 세기
groups.size()는 각 값 쌍으로 이루어진 그룹의 행 수를 반환합니다. reset_index(name="Count")를 호출하면 두 그룹화 수준과 행 수가 일반 열로 바뀌어 표시하거나 후속 작업에 사용하기 편합니다. size()는 Age처럼 그룹화에 사용하지 않은 필드에 결측값이 있어도 행을 셉니다. 반면 특정 열을 세면 결측값이 아닌 항목만 계산하므로 결과가 달라질 수 있습니다. 따라서 Count 열은 Gender/Employed 값 쌍마다 있는 행 수를 뜻하며, 값이 입력된 이름이나 나이의 개수를 뜻하지 않습니다.
열의 각 값에서 가장 큰 그룹 찾기
마지막 식은 값 쌍별 행 수에서 시작해 해당 Series를 Employed 인덱스 수준으로 다시 그룹화한 다음 max()를 적용합니다. 결과는 고용 여부별로 가장 큰 Gender 하위 그룹의 크기입니다. 이 데이터에서는 Female/Yes 그룹과 Male/No 그룹에 각각 행이 두 개 있으므로, 두 고용 범주 모두 가장 큰 하위 그룹의 크기는 2입니다. 이는 하위 그룹 행 수의 최댓값입니다. 해당 행을 선택하거나 최댓값을 만든 Gender를 알려 주지는 않습니다. max() 메서드는 별도로 설명되어 있습니다.