[Pandas] value_counts
Pandas value_counts, Series value_counts, 빈도수 pandas
정의
Series.value_counts() 는 각 고유값의 등장 빈도 를 내림차순 Series 로 반환. SQL 의 GROUP BY ... ORDER BY count DESC.
pandas 1.1+ 부터는 DataFrame.value_counts() 도 가능 (여러 컬럼 조합).
기본
python
import pandas as pd
s = pd.Series(['A', 'B', 'A', 'C', 'B', 'A', 'B'])
print(s.value_counts()) 결과
A 3
B 3
C 1
Name: count, dtype: int64| value | count |
|---|---|
| A | 3 |
| B | 3 |
| C | 1 |
옵션
s.value_counts(normalize=True) # 비율 (sum to 1)
s.value_counts(ascending=True) # 오름차순
s.value_counts(dropna=False) # NaN 도 카운트
s.value_counts(bins=5) # 수치형, 5 개 구간으로 binning
normalize
python
import pandas as pd
s = pd.Series(['A', 'B', 'A', 'C', 'B', 'A', 'B'])
print(s.value_counts(normalize=True)) 결과
A 0.428571
B 0.428571
C 0.142857
Name: proportion, dtype: float64비율 → 분포 분석에 유용.
DataFrame.value_counts (다중 컬럼)
df.value_counts(['city', 'plan'])
# (city, plan) 조합의 빈도
python
import pandas as pd
df = pd.DataFrame({
'city': ['Seoul','Busan','Seoul','Busan','Seoul'],
'plan': ['pro','basic','pro','basic','basic'],
})
print(df.value_counts()) 결과
city plan
Seoul pro 2
Busan basic 2
Seoul basic 1
Name: count, dtype: int64MultiIndex Series 결과.
bins (수치형 분포)
ages = pd.Series([22, 25, 31, 35, 42, 55, 18, 29])
ages.value_counts(bins=4)
# (17.999, 27.25] 3
# (27.25, 36.5] 3
# (36.5, 45.75] 1
# (45.75, 55.0] 1
자동으로 구간 분할, Pandas cut / qcut 의 quick version.
SQL 비교
SELECT value, COUNT(*) AS count
FROM table
GROUP BY value
ORDER BY count DESC
s.value_counts() 한 줄과 같다.
활용 패턴
상위 N 개 카테고리
top10 = s.value_counts().head(10)
빈도가 낮은 카테고리 묶기
counts = df['category'].value_counts()
rare = counts[counts < 10].index
df['category'] = df['category'].where(~df['category'].isin(rare), 'OTHER')
빈도 시각화
df['category'].value_counts().plot(kind='bar')
value_counts vs groupby + size
s.value_counts() # ↓ 같은 결과
df.groupby('city').size().sort_values(ascending=False)
value_counts 가 더 짧고 명시적.
함정
1. NaN 기본 제외
s.value_counts() # NaN 제외
s.value_counts(dropna=False) # NaN 포함
2. category dtype 의 차이
s = pd.Series(['A','B','A'], dtype='category')
s.value_counts() # 등장한 카테고리만
# Categorical 의 categories 에 정의됐지만 등장 안 한 값은?
# pandas 2.x: observed=False 로 포함 가능
3. Series 가 아닌 DataFrame 에 호출
df.value_counts() # 모든 컬럼 조합의 빈도 (1.1+)
df.value_counts('col') # 단일 컬럼
참고
이 글의 용어 (4개)
- [Pandas] cut / qcutpandas
- 정의 - : 값 기반 binning (구간을 직접 지정) - : 빈도 기반 binning (분위수로 같은 크기) 연속형 변수를 범주형으로 변환. ML 의 feature engin…
- [Pandas] drop_duplicates / duplicatedpandas
- 정의 - : 각 행이 중복인지 boolean Series 반환 - : 중복 행 제거 후 DataFrame 반환 와는 다르다. 그건 Series 의 고유값 추출, 이건 행 단위 처…
- [Pandas] groupbypandas
- 정의 는 데이터를 그룹으로 나누고 (split), 각 그룹에 함수를 적용 (apply), 결과를 합쳐 (combine) 새 DataFrame 으로 만드는 split-apply-c…
- [Pandas] Seriespandas
- 정의 는 1차원 레이블 배열. NumPy + 의 결합. 의 한 열이 곧 Series. 핵심 속성 | 속성 | 의미 | |:---|:---| | | numpy array | | |…
💬 댓글