Pandas에서 'count(distinct)' 동등 기능
방법 1: unique()
함수 사용
import pandas as pd
# 데이터 준비
data = {'name': ['Alice', 'Bob', 'Charlie', 'David', 'Alice', 'Bob'],
'age': [30, 25, 22, 27, 30, 25]}
df = pd.DataFrame(data)
# 고유 값 개수 계산
n_unique_names = len(df['name'].unique())
n_unique_ages = len(df['age'].unique())
print(f"이름의 고유 개수: {n_unique_names}")
print(f"나이의 고유 개수: {n_unique_ages}")
설명:
unique()
함수는 특정 열에 있는 모든 고유 값을 배열로 반환합니다.len()
함수는 배열의 길이를 계산하여 고유 값 개수를 얻습니다.
장점:
- 간결하고 명확한 코드
- 작은 데이터 세트에 효율적
단점:
- 큰 데이터 세트에 비효율적일 수 있습니다.
import pandas as pd
# 데이터 준비 (위와 동일)
# 고유 값 개수 계산
n_unique_names = df['name'].nunique()
n_unique_ages = df['age'].nunique()
print(f"이름의 고유 개수: {n_unique_names}")
print(f"나이의 고유 개수: {n_unique_ages}")
nunique()
함수는 DataFrame의 각 열에 대한 고유 값 개수를 Series로 반환합니다.- 특정 열에 대한 값을 선택하려면 열 이름을 인덱싱으로 사용합니다.
unique()
함수보다 빠름groupby
와 함께 사용하기 편리
- Pandas 0.24 이전 버전에서는 사용할 수 없음
방법 3: value_counts()
함수 사용
import pandas as pd
# 데이터 준비 (위와 동일)
# 고유 값 개수 계산
n_unique_names = df['name'].value_counts().sum()
n_unique_ages = df['age'].value_counts().sum()
print(f"이름의 고유 개수: {n_unique_names}")
print(f"나이의 고유 개수: {n_unique_ages}")
value_counts()
함수는 각 고유 값의 개수를 Series로 반환합니다.sum()
함수는 Series의 모든 값을 합산하여 고유 값 개수를 얻습니다.
- 각 고유 값의 개수를 함께 확인할 수 있음
- 다른 방법들보다 느릴 수 있음
방법 4: 그룹별 고유 값 개수 계산
import pandas as pd
# 데이터 준비 (위와 동일)
# 그룹별 고유 값 개수 계산
n_unique_per_group = df.groupby('name')['age'].nunique()
print(n_unique_per_group)
groupby()
함수를 사용하여 DataFrame을 그룹으로 나눕니다.- 각 그룹에 대해
nunique()
함수를 적용하여 고유 값 개수를 계산합니다.
- 각 그룹별 고유 값 개수를 계산할 수 있음
- 데이터 세트가 크고 그룹 수가 많을 경우 느릴 수 있음
결론
각 방법마다 장단점이 있으므로, 상황에 맞는 방법을 선택하는 것이 중요합니다. 일반적으로 작은 데이터 세트에는 unique()
또는 nunique()
함수를 사용하고, 큰 데이터 세트 또는 그룹별 고유 값 개수를 계산해야 하는 경우에는 groupby
와 함께 사용하는 것이 좋습니다.
참고:
- Pandas 공식 문서:
import pandas as pd
# 데이터 준비
data = {'name': ['Alice', 'Bob', 'Charlie', 'David', 'Alice', 'Bob', 'Charlie'],
'age': [30, 25, 22, 27, 30, 25, 22]}
df = pd.DataFrame(data)
# 고유 값 개수 계산 (3가지 방법)
method1_names = len(df['name'].unique())
method1_ages = len(df['age'].unique())
method2_names = df['name'].nunique()
method2_ages = df['age'].nunique()
method3_names = df['name'].value_counts().sum()
method3_ages = df['age'].value_counts().sum()
# 그룹별 고유 값 개수 계산
method4 = df.groupby('name')['age'].nunique()
# 결과 출력
print("## 방법 1: unique() 함수 사용")
print(f"이름의 고유 개수: {method1_names}")
print(f"나이의 고유 개수: {method1_ages}")
print("\n## 방법 2: nunique() 함수 사용")
print(f"이름의 고유 개수: {method2_names}")
print(f"나이의 고유 개수: {method2_ages}")
print("\n## 방법 3: value_counts() 함수 사용")
print(f"이름의 고유 개수: {method3_names}")
print(f"나이의 고유 개수: {method3_ages}")
print("\n## 방법 4: groupby와 nunique() 함수 사용")
print(method4)
이 코드는 위에서 설명한 4가지 방법을 모두 보여주는 예제입니다.
- 데이터를
data
딕셔너리에 준비합니다. data
딕셔너리를 사용하여df
DataFrame을 만듭니다.- 각 방법으로 고유 값 개수를 계산하고 결과를 출력합니다.
결과:
## 방법 1: unique() 함수 사용
이름의 고유 개수: 4
나이의 고유 개수: 3
## 방법 2: nunique() 함수 사용
이름의 고유 개수: 4
나이의 고유 개수: 3
## 방법 3: value_counts() 함수 사용
이름의 고유 개수: 4
나이의 고유 개수: 3
## 방법 4: groupby와 nunique() 함수 사용
name
Alice 2
Bob 2
Charlie 2
Name: age, dtype: int64
Pandas에서 'count(distinct)' 대체 방법: 추가 정보 및 고급 기능
drop_duplicates() 함수 사용:
drop_duplicates()
함수는 DataFrame에서 중복된 행을 제거하여 고유한 행의 개수를 간접적으로 계산하는 데 사용할 수 있습니다.- 이 방법은 고유 값 개수만 필요하고 다른 열 데이터에 영향을 미치지 않을 때 유용합니다.
import pandas as pd
# 데이터 준비 (위와 동일)
# 고유 행 개수 계산
n_unique_rows = df.drop_duplicates().shape[0]
print(f"고유 행 개수: {n_unique_rows}")
lambda 함수 및 groupby 적용:
lambda
함수를 사용하여 사용자 정의 논리를groupby
와 함께 적용하여 더욱 복잡한 고유 값 계산을 수행할 수 있습니다.- 예를 들어, 특정 조건을 충족하는 고유 값 개수를 계산하는 데 사용할 수 있습니다.
import pandas as pd
# 데이터 준비 (위와 동일)
# 특정 조건을 충족하는 고유 값 개수 계산
def is_adult(age):
return age >= 18
n_unique_adults = df.groupby('name')['age'].apply(lambda x: x[x >= 18].nunique()).sum()
print(f"성인의 고유 개수 (나이 18세 이상): {n_unique_adults}")
Series.dtype.categories 속성 사용 (범주형 데이터에만 해당):
- 범주형 데이터를 다루는 경우
Series.dtype.categories
속성을 사용하여 고유 값 개수를 빠르게 계산할 수 있습니다.
import pandas as pd
# 범주형 데이터 예시
data = {'category': ['A', 'B', 'A', 'C', 'B']}
df = pd.DataFrame(data)
# 고유 값 개수 계산
n_unique_categories = df['category'].dtype.categories.size
print(f"범주형 데이터의 고유 개수: {n_unique_categories}")
SQL 데이터베이스 연결 사용:
- Pandas는 SQL 데이터베이스와 연결하여 고유 값 계산을 데이터베이스 쿼리로 오프로드하는 데 사용할 수 있습니다.
- 이 방법은 매우 큰 데이터 세트를 처리하거나 복잡한 쿼리를 수행해야 하는 경우 유용할 수 있습니다.
import pandas as pd
import sqlalchemy as sa
# 데이터베이스 연결 설정
engine = sa.create_engine('sqlite:///data.db')
# 데이터를 SQL 테이블로 로드
df.to_sql('my_table', engine, if_exists='replace')
# SQL 쿼리 사용하여 고유 값 계산
with engine.connect() as connection:
n_unique_values = connection.execute('SELECT COUNT(DISTINCT category) FROM my_table').fetchone()[0]
print(f"범주형 데이터의 고유 개수 (SQL 쿼리): {n_unique_values}")
- 위에 제시된 방법은 Pandas에서 'count(distinct)' 기능을 대체하는 데 사용할 수 있는 몇 가지 옵션일 뿐입니다. 상황에 맞는 가장 적합한 방법을 선택하는 것이 중요합니다.
- Pandas 공식 문서 및 다른 온라인 자료에서 Pandas 고유 값 계산에 대한 자세한 정보를 찾을 수 있습니다.
python pandas count