Pandas - value_counts(), 고유값의 빈도와 비율을 같이 표시하기
Contents
value_counts() 두 개를 엮어서 빈도와 비율을 같이 표시해보자.
1. 핵심 요약
- 아래와 같이
value_counts()결과 두 개를join()해서 예쁘게 표현할 수 있음
# 개수랑 비율 같이. column명도 바꿔서 표시
df['embark_town'].value_counts(dropna=False).to_frame('count').join(
df['embark_town'].value_counts(dropna=False, normalize=True).to_frame('normalize')
).round(4)
| count | normalize | |
|---|---|---|
| Southampton | 644 | 0.7228 |
| Cherbourg | 168 | 0.1886 |
| Queenstown | 77 | 0.0864 |
| NaN | 2 | 0.0022 |
2. 사용 예시
먼저 titanic 데이터셋을 불러오자. (seaborn 패키지 이용)
import pandas as pd
import seaborn as sns
# seaborn 패키지에서 titanic 데이터셋 불러와 사용
df = sns.load_dataset('titanic')
print(df.shape)
df.head()
(891, 15)
| survived | pclass | sex | age | sibsp | parch | fare | embarked | class | who | adult_male | deck | embark_town | alive | alone | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 0 | 3 | male | 22.0 | 1 | 0 | 7.2500 | S | Third | man | True | NaN | Southampton | no | False |
| 1 | 1 | 1 | female | 38.0 | 1 | 0 | 71.2833 | C | First | woman | False | C | Cherbourg | yes | False |
| 2 | 1 | 3 | female | 26.0 | 0 | 0 | 7.9250 | S | Third | woman | False | NaN | Southampton | yes | True |
| 3 | 1 | 1 | female | 35.0 | 1 | 0 | 53.1000 | S | First | woman | False | C | Southampton | yes | False |
| 4 | 0 | 3 | male | 35.0 | 0 | 0 | 8.0500 | S | Third | man | True | NaN | Southampton | no | True |
🔷 고유값들의 빈수 확인
Series(여기서는 df['embark_town'])의 value_count()를 호출하면 고유값들의 빈도수를 표시해준다.
단, 여기서 NaN은 따로 세지 않는다.
# 고유값들의 개수 확인 (NaN은 세지 않음)
df['embark_town'].value_counts()
Southampton 644
Cherbourg 168
Queenstown 77
Name: embark_town, dtype: int64
🔷 NaN의 개수도 같이 확인
NaN의 개수도 같이 확인하려면 dropna=False 를 명시적으로 적어주어야 한다.
# NaN의 개수도 같이 확인
df['embark_town'].value_counts(dropna=False)
Southampton 644
Cherbourg 168
Queenstown 77
NaN 2
Name: embark_town, dtype: int64
🔷 비율로 확인
비율도 같이 보면 더 와 닿을 것 같다.normalize=True 를 주자.
# 비율로 확인
df['embark_town'].value_counts(dropna=False, normalize=True)
Southampton 0.722783
Cherbourg 0.188552
Queenstown 0.086420
NaN 0.002245
Name: embark_town, dtype: float64
🔷 빈도와 비율 같이 표시
빈도랑 비율 둘 다 한꺼번에 표시하고 싶다.
아래와 같이 agg() 를 활용할 수 있다.
# 개수랑 비율 같이 표시
df['embark_town'].agg([pd.Series.value_counts, lambda x: x.value_counts(normalize=True)])
| value_counts | <lambda> | |
|---|---|---|
| Southampton | 644 | 0.724409 |
| Cherbourg | 168 | 0.188976 |
| Queenstown | 77 | 0.086614 |
🔷 빈도와 비율 같이 표시. column명도 변경
그런데 NaN이 빠져있고, column명도 마음에 안든다.
아래처럼 하면, column 이름까지 바꿔서 예쁘게 표시할 수 있다.
# 개수랑 비율 같이 예쁘게 표시
df['embark_town'].value_counts(dropna=False).to_frame('count').join(
df['embark_town'].value_counts(dropna=False, normalize=True).to_frame('normalize')
).round(4)
| count | normalize | |
|---|---|---|
| Southampton | 644 | 0.7228 |
| Cherbourg | 168 | 0.1886 |
| Queenstown | 77 | 0.0864 |
| NaN | 2 | 0.0022 |
Reference
- {stackoverflow} pandas value_counts (show values and ratio)
- {blog} Displaying both the values and ratios using pandas value_counts()
- {Medium} 9 Pandas value_counts() tricks to improve your data analysis
- {pandas API} pandas.Series.value_counts