Pandas의 value_counts() 함수는
데이터분석을 하는데 있어,
가장 기초적이면서 일반적으로 사용되는
함수 중 하나입니다.
기본적으로 지정된
열의 각 값(value)에 대한
모든 발생 횟수를 반환합니다.
단순한 방법 이외에
여러 옵션을 사용해서
그 이상의 역할을 수행할 수 있습니다.
시작하려면 먼저 데이터가 필요합니다.
작은 데이터 프레임을 만들어서
여러 가지 옵션을 사용해 보겠습니다.
import numpy as np
import pandas as pd
exData = {"Name": ["James","Dan","Jonathan","Eric","Joanna","Mary","Sue","Jim","Lionel","Tim"],
"Sex":["Male","Male","Male","Male","Female","Female","Female","Male","Male","Male"],
"Score":[80,91,75,88,89,90,92,91,82,80],
"Grade":["B","A","C","B","B","A","A",np.nan,"B",np.nan]}
exData = pd.DataFrame({"Name": ["James","Dan","Jonathan","Eric","Joanna","Mary","Sue","Jim","Lionel","Tim"],
"Sex":["Male","Male","Male","Male","Female","Female","Female","Male","Male","Male"],
"Score":[80,91,75,88,89,90,92,91,82,80],
"Grade":["B","A","C","B","B","A","A",np.nan,"B",np.nan]})
exData
위의 데이터 프레임을 가지고
value_counts() 메서드를 사용하는
10가지 다른 방법을 살펴보겠습니다.
1. 기본 파라미터
가장 기본적인 적용입니다.
열에 있는 모든 고윳값(unique value)의
개수를 반환합니다.
아래 예에서는 데이터 프레임의
'Grade' 열에 있는 모든 고윳값의
개수를 반환합니다.
# "Grade" 열의 고윳값(unique value) 반환
exData["Grade"].value_counts()
예상대로 열의 각 고윳값에 대한
개수를 반환합니다.
기본 사용으로는
NaN 값을 완전히 무시하기 때문에,
NaN 존재 여부 및 NaN 개수 자체가
출력이 안됩니다.
이는 dropna 인수 기본값이
True로 설정되어 있기 때문입니다.
2. NaN 값 표시
결과에 NaN 값을 포함하려면
dropna 매개변수를
False로 설정하면 됩니다.
# NaN 값 출력
exData["Grade"].value_counts(dropna = False)
결과에서 볼 수 있듯이
이제 두 NaN 값이 모두 설명됩니다.
또한 count 값이
가장 높은 것에서 가장 낮은 것까지
내림차순으로 정렬되어
있음을 알 수 있습니다.
다른 매개변수로
오름차순 정렬이 가능합니다.
3. 오름차순 정렬
오름차순 매개변수를 사용하면
카운트 값이 정렬되는 순서를
변경할 수 있습니다.
기본적으로 False로 설정되어 있으므로
가장 낮은 값에서 가장 높은 값까지
결과를 보려면 매개변수 값을
True로 변경하기만 하면 됩니다.
# 값 기준의 오름차순 정렬
exData["Grade"].value_counts(dropna = False, ascending = True)
이제 count 값이
오름차순으로 정렬됩니다.
정렬을 전혀 원하지 않는다면
어떻게 될까요?
4. 정렬하지 않기
정렬 매개변수는
count 값을 정렬할지 여부를 지정합니다.
기본적으로 True로 설정되어 있으므로
False로 설정하면 카운트 값이
특정 순서 없이 결과를 반환합니다.
# 정렬하지 않기
exData["Grade"].value_counts(dropna = False, sort = False)
결과는
오름차순도 내림차순도 아닙니다.
지금까지는
열에 있는 값의 간단한 개수만
반환했습니다.
옵션을 활용하여 값의 상대 빈도(%)를
대신 반환할 수도 있습니다.
5. 값의 상대 빈도 구하기
열에 있는 값의 상대적 빈도,
즉 전체 관찰 수 내에서
값이 발생하는 횟수의 비율을 반환하려면
normalize 매개변수를 True로
설정하기만 하면 됩니다.
# 상대 빈도 구하기
exData["Grade"].value_counts(dropna = False, normalize = True)
6. 연속형 자료를 이산형 자료로(Bin)
bin 인수를 사용하여
연속 데이터를 이산 간격으로
binning 할 수 있습니다.
숫자 값이 포함된 열에만
사용할 수 있습니다.
정수나 리스트를 bin 인수에
전달합니다.
bin에 정수를 전달하면
입력에 따라 값이 동일한 크기의
bin으로 분할됩니다.
# 연속형 자료를 이산형 자료로 변환
# 3개의 구간으로 범주화
exData["Score"].value_counts(bins = 3, sort = False)
리스트를 bin에 전달하면
리스트에 지정된 간격에 따라
값이 binning 됩니다.
# 연속형 자료를 사용자 지정 구간으로 Binning
exData["Score"].value_counts(bins = [70,80,90,100], sort = False)
7. 기타 다른 여러 방법 및 옵션
더 많은 가치를 도출하기 위해
value_counts() 함수를
다른 메서드와 결합해야
할 수도 있습니다.
세 가지 예를 살펴보겠습니다.
7.1. sort_index()
결과를 알파벳순으로 정렬하려면
value_counts() 메서드의 맨 끝에
.sort_index()를 추가하기만 하면 됩니다.
# 알파벳 순서로 정렬
exData["Grade"].value_counts().sort_index()
오름차순 매개변수를 False로 설정하여
알파벳 역순으로
값을 정렬할 수도 있습니다.
# 알파벳 역순 정렬
exData["Grade"].value_counts().sort_index(ascending = False)
7.2. groupby()
groupby() 함수를 통해
먼저 다른 열에 따라
값을 그룹화한 다음
계산을 수행할 수 있습니다.
# "Sex"에 따른 "Grade"의 값 확인
exData.groupby("Sex")["Grade"].value_counts()
7.3. to_frame()
value_counts() 메서드는
Pandas Series 객체를 반환합니다.
더 쉬운 분석을 위해 이것을
데이터 프레임으로 변환하려는 경우
코드 끝에 to_frame() 메서드를
추가하기만 하면 됩니다.
# Series를 Dataframe으로 변환
gradeCount = exData["Grade"].value_counts().to_frame()
gradeCount
# 칼럼명 변경
gradeCount = gradeCount.reset_index().rename(columns = {"index":"Grade","Grade":"Count"})
# gradeCount 출력
print(gradeCount)
# gradeCount 자료형 출력
print(type(gradeCount))
8. 보너스: 조건 지정
열에서 값의 발생 횟수를
조건에 맞는 경우에만
반환할 수 있습니다.
개수가 2보다 큰 값에 대해서만
결과를 반환하고 싶다면,
lambda 함수와 함께
loc을 추가하면 됩니다.
# 조건 명시
exData["Grade"].value_counts().loc[lambda x : x > 2]
결론
이번 포스팅에서는
단순한 카운트를 반환하는 것 이상으로
Pandas에서 value_counts() 메서드의
10가지 다른 사용 사례를 보았습니다.
이렇게 다양한 사용법을 활용하면
시간을 절약하는 동시에
원하는 방식으로 귀중한 정보를
제공할 수 있습니다.
이러한 사용 사례는
데이터 전처리 또는
탐색적 데이터 분석 작업에 있어
매우 유용하게 활용할 수 있습니다.
실제 데이터 분석 시
value_counts() 함수 적용 사례가
궁금하시다면 아래 포스팅 글을
참고하시면 좋을 듯 합니다.
참고로, pandas의 value_counts()와
유사한 함수로
crosstab() 함수가 있습니다.
이 함수에 대해 궁금하신 분들은
아래 링크에 접속하셔서
확인하시면 됩니다.
https://zzinnam.com/pandas-crosstab-%ed%95%a8%ec%88%98-%ec%9d%b4%ed%95%b4%ed%95%98%ea%b8%b0/
또한, Python Pandas 라이브러리를
활용한 데이터 분석에 필요한 기초 함수를
조금 더 알고 싶으시면,
아래 링크를 참고하세요.
감사합니다.
"이 포스팅은 쿠팡 파트너스 활동의 일환으로,
이에 따른 일정액의 수수료를 제공받습니다."
'Python > Pandas' 카테고리의 다른 글
Map(), Apply(), ApplyMap() 함수 사용 방법 (0) | 2022.06.11 |
---|---|
Pandas 데이터를 그룹화하는 가장 좋은 방법(groupby, Grouper) (0) | 2022.06.01 |
Pandas 행 단위 연산 - iterrows(), itertuples(), iloc, loc 함수 (0) | 2022.03.09 |
pandas rank() 함수 - 숫자 데이터의 순위 계산 함수 (0) | 2022.03.06 |
pandas 문자열 메서드 str. (0) | 2022.02.13 |
댓글