Python Pandas 그룹별 고유 값 수 세기
데이터프레임에서 특정 열을 기준으로 그룹을 나눈 후 각 그룹별로 고유한 값의 개수를 세고 싶습니다.
해결 방법:
Pandas에서 groupby
와 nunique
함수를 사용하여 문제를 해결할 수 있습니다.
예시 데이터:
import pandas as pd
df = pd.DataFrame({
"Country": ["Korea", "USA", "Korea", "Japan", "USA"],
"City": ["Seoul", "New York", "Busan", "Tokyo", "Los Angeles"],
"Product": ["A", "B", "C", "A", "B"]
})
그룹별 고유 값 수 계산:
# Country 열을 기준으로 그룹화
grouped_df = df.groupby("Country")
# 각 그룹별 Product 열의 고유 값 수 계산
unique_product_counts = grouped_df["Product"].nunique()
# 결과 출력
print(unique_product_counts)
결과:
Country
Korea 2
USA 2
Japan 1
Name: Product, dtype: int64
코드 설명:
groupby
: 데이터프레임을 특정 열을 기준으로 그룹으로 나눕니다.nunique
: 각 그룹별 고유 값의 개수를 계산합니다.
추가 옵션:
dropna=True
: 결측값을 고유 값 계산에서 제외합니다.sort=True
: 결과를 고유 값 개수 기준으로 정렬합니다.
예시:
unique_product_counts = grouped_df["Product"].nunique(dropna=True).sort_values(ascending=False)
활용:
- 특정 그룹에서 특정 제품이 얼마나 다양하게 판매되는지 분석
예제 코드
import pandas as pd
# 예시 데이터
df = pd.DataFrame({
"Country": ["Korea", "USA", "Korea", "Japan", "USA"],
"City": ["Seoul", "New York", "Busan", "Tokyo", "Los Angeles"],
"Product": ["A", "B", "C", "A", "B"]
})
# Country 열을 기준으로 그룹화
grouped_df = df.groupby("Country")
# 각 그룹별 Product 열의 고유 값 수 계산
unique_product_counts = grouped_df["Product"].nunique()
# 결과 출력
print(unique_product_counts)
Country
Korea 2
USA 2
Japan 1
Name: Product, dtype: int64
추가 옵션:
unique_product_counts = grouped_df["Product"].nunique(dropna=True).sort_values(ascending=False)
Pandas Groupby Count Unique Values 대체 방법
unique_product_counts = grouped_df.agg(lambda x: len(x.unique()))
# 결과 출력
print(unique_product_counts)
for 루프 사용:
unique_product_counts = {}
for country, group in grouped_df:
unique_product_counts[country] = len(group["Product"].unique())
# 결과 출력
print(unique_product_counts)
collections.Counter 사용:
from collections import Counter
unique_product_counts = grouped_df["Product"].apply(Counter).value_counts()
# 결과 출력
print(unique_product_counts)
itertools.groupby 사용:
from itertools import groupby
unique_product_counts = {
key: len(set(values))
for key, values in groupby(df["Product"], df["Country"])
}
# 결과 출력
print(unique_product_counts)
dict comprehension 사용:
unique_product_counts = {
country: len(set(group["Product"]))
for country, group in grouped_df
}
# 결과 출력
print(unique_product_counts)
map 함수 사용:
unique_product_counts = dict(map(lambda x: (x[0], len(set(x[1]["Product"]))), grouped_df))
# 결과 출력
print(unique_product_counts)
defaultdict 사용:
from collections import defaultdict
unique_product_counts = defaultdict(set)
for country, group in grouped_df:
unique_product_counts[country].update(group["Product"])
unique_product_counts = {key: len(value) for key, value in unique_product_counts.items()}
# 결과 출력
print(unique_product_counts)
주의 사항:
- 대체 방법들은
nunique
함수보다 느릴 수 있습니다. - 코드의 가독성이 떨어질 수 있습니다.
python pandas group-by