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