본문 바로가기
목차
Python/pandas

[Pandas] unique(), value_counts(), nunique()

by ds31x 2025. 8. 23.
728x90
반응형

https://rfriend.tistory.com/267

 

범주형(categorical) 데이터 전처리 상황에서 많이 사용되는 메서드들임.

 

종류가 적은 값을 가지는 데이터들을 분석하는데 주로 이용됨.

  • unique(): 고유값 배열 반환.
  • value_counts(): 고유값과 빈도 를 확인 가능케 함.
  • nunique(): 고유값 개수를 반환.

범주형 데이터에는
예상치 못한 값이 섞여 있을 수 있으므로
반드시 확인 후 Data Cleaning이 필요


0. Create Sample DataFrame (샘플 DataFrame 생성)

import pandas as pd

# DataFrame 생성
data = {
    "Name": ["Alice", "Bob", "Charlie", "Alice", "David", "Bob"],
    "Gender": ["Female", "Male", "Male", "Female", "Male", "Male"],
    "Class": ["1st", "2nd", "3rd", "1st", "*", "2nd"]
}

df = pd.DataFrame(data)
print(df)

# 출력 예시:
# 
#       Name  Gender Class
# 0    Alice  Female   1st
# 1      Bob    Male   2nd
# 2  Charlie    Male   3rd
# 3    Alice  Female   1st
# 4    David    Male     *
# 5      Bob    Male   2nd

1. unique() : 고유값 확인

  • 중복을 제거한 고유값 배열 반환
  • 출력 형식: NumPy 배열(ndarray)
df["Gender"].unique()

# 출력:
# 
# array(['Female', 'Male'], dtype=object)
  • 어떤 값들이 있는지만 확인할 때 사용

Series 객체에서 지원.


2. value_counts() :고유값과 빈도 확인

  • 고유값과 빈도(count) 반환
  • 출력 형식: Pandas Series
df["Gender"].value_counts()

# 출력:
# 
# Male      4
# Female    2
# Name: Gender, dtype: int64
  • 어떤 고유값이 얼마나 자주 등장하는지 확인 가능.
Pandas 1.1.0 이후, DataFrame.value_counts() 지원
모든 열을 하나의 **tuple(튜플)**로 묶어 고유한 행(row) 조합의 빈도를 반환

3. nunique() : 고유값 개수 확인

  • 고유값의 개수 반환
  • 출력 형식: 정수 (integer)
df["Gender"].nunique()

# 출력:
# 
# 2
  • 단순히 개수만 필요할 때 사용

DataFrame객체에 직접 사용할 경우, axis 인자로 행/열 기준을 지정 가능함.


4. Data Cleaning Example

  • Class 열에는 원래 1st, 2nd, 3rd만 존재해야 함
  • 그러나 * 값이 발견됨
df["Class"].value_counts()

# 출력:
# 
# 1st    2
# 2nd    2
# 3rd    1
# *      1
# Name: Class, dtype: int64
  • 잘못된 카테고리는 전처리 과정에서 제거 또는 보정 필요
  • 대표적인 처리 방법: 결측치 처리(missing value handling), 다른 범주로 통합, 머신러닝 기반 대체(예: 클러스터링)

위의 잘못된 Category를 처리하는 간단한 예는 다음과 같음:

import pandas as pd
import numpy as np

# 예시 DataFrame 생성
data = {
    "Name": ["Alice", "Bob", "Charlie", "Alice", "David", "Bob"],
    "Gender": ["Female", "Male", "Male", "Female", "Male", "Male"],
    "Class": ["1st", "2nd", "3rd", "1st", "*", "2nd"]
}

df = pd.DataFrame(data)

# 1. '*' 값을 NaN(결측치)로 변환
df["Class"] = df["Class"].replace("*", np.nan)

print("Step 1: '*' → NaN 변환 후")
print(df, "\n")

# 2. 결측치 처리 방법 (예시)

# (a) 가장 많이 등장하는 값(mode)으로 대체
df_mode_filled = df.copy()
df_mode_filled["Class"].fillna(df_mode_filled["Class"].mode()[0], inplace=True)

print("Step 2a: Mode(최빈값)으로 대체")
print(df_mode_filled, "\n")

# (b) 임의로 'Unknown'이라는 새로운 범주로 대체
df_unknown_filled = df.copy()
df_unknown_filled["Class"].fillna("Unknown", inplace=True)

print("Step 2b: 'Unknown' 범주로 대체")
print(df_unknown_filled, "\n")

# (c) 단순히 결측치 행 제거
df_dropped = df.dropna(subset=["Class"])

print("Step 2c: 결측치 행 제거")
print(df_dropped)
  • replace("*", np.nan): 잘못된 카테고리의 값을 결측치로 변환
  • fillna(mode()): 최빈값으로 대체
  • fillna("Unknown"): 새로운 범주로 처리
  • dropna(): 결측치 행 삭제

결과는 다음과 같음:

Step 1: '*' → NaN 변환 후
      Name  Gender Class
0    Alice  Female   1st
1      Bob    Male   2nd
2  Charlie    Male   3rd
3    Alice  Female   1st
4    David    Male   NaN
5      Bob    Male   2nd 

Step 2a: Mode(최빈값)으로 대체
      Name  Gender Class
0    Alice  Female   1st
1      Bob    Male   2nd
2  Charlie    Male   3rd
3    Alice  Female   1st
4    David    Male   1st
5      Bob    Male   2nd 

Step 2b: 'Unknown' 범주로 대체
      Name  Gender    Class
0    Alice  Female      1st
1      Bob    Male      2nd
2  Charlie    Male      3rd
3    Alice  Female      1st
4    David    Male  Unknown
5      Bob    Male      2nd 

Step 2c: 결측치 행 제거
      Name  Gender Class
0    Alice  Female   1st
1      Bob    Male   2nd
2  Charlie    Male   3rd
3    Alice  Female   1st
5      Bob    Male   2nd

같이보면 좋은 자료들

https://dsaint31.tistory.com/469#1-2.%20Categorical%20data%20(frequency%20data)-1-3

 

[Math] Type of Data and Scale of Measurement

Type of Data and Scale of Measurement1. Type of Data1-1. Measurement data (quantitative data)Measurement(측정)의 결과로 얻어진 data. 예를 든다면, 스트레스지수, 체중, 하루당 마시는 술의 양 등이 이에 해당한다.Data obtai

dsaint31.tistory.com

2025.05.16 - [Python/pandas] - [ML] pandas.DataFrame 에서 EDA에 적합한 메서드 요약

 

[ML] pandas.DataFrame 에서 EDA에 적합한 메서드 요약

Pandas DataFrame에서 탐색적 데이터 분석(EDA)에 사용할 수 있는 주요 메서드들은 다음과 같음:2024.05.18 - [분류 전체보기] - [ML] Exploratory Data Analysis (EDA) [ML] Exploratory Data Analysis (EDA)Exploratory Data Analysis (

ds31x.tistory.com

 

728x90

'Python > pandas' 카테고리의 다른 글

[Pandas] melt() 메서드  (2) 2025.08.24
[Pandas] missing value 확인: 결측치 확인  (0) 2025.08.24
[Pandas] stack() 과 unstack()  (0) 2025.08.23
[Pandas] 값 변경하기 - replace  (0) 2025.08.22
[Pandas] Indexer - loc, iloc, at, iat  (0) 2025.08.22