파이썬 기반 데이터분석을 위하여 Pandas 객체의 고유한 원소 또는 행을 세는 것을 알아보고자 한다.
개요
고객 데이터에서 몇 명의 고객의 데이터가 있는지, 부서별 월별 실적 데이터에서 몇 개 부서의 데이터가 있는지 알아보려면 고객 또는 부서 관련
데이터 준비
다음과 같이 데이터를 준비한다.
1 | df = pd.DataFrame({"cat": ["food", "food", "snack", "snack", "snack"], |
cat | type | price | star | |
---|---|---|---|---|
0 | food | A | 100 | 3.1 |
1 | food | A | 100 | 3.5 |
2 | snack | B | 300 | 4.3 |
3 | snack | C | 200 | 4.0 |
4 | snack | B | 500 | 3.9 |
시리즈(Series)
데이터프레임의 특정 변수를 뽑아내면 시리즈 객체가 되는데 해당 객체를 기준으로 다루는 시나리오를 알아보자.
집합 함수인 set()
의 특성을 활용하여 원소 개수를 셀 수 있다.
1 | len(set(df["cat"])) |
시리즈 객체의 중복제거 메서드인 .unique()
를 사용할 수 있다.
1 | len(df["cat"].unique()) |
시리즈 객체의 고유한 원소 개수를 세는 메서드인 .nunique()
를 사용할 수 있다.
1 | df["cat"].nunique() |
시리즈 객체의 고유한 원소별 개수를 세거나 비율을 계산하는 메서드인 .value_counts()
를 사용할 수 있다.
1 | df["cat"].value_counts() |
.value_counts()
의 경우 “normalize” 인자에 True
를 할당하면 고유한 원소가 시리즈 객체에서 차지하는 비율을 계산할 수 있다.
1 | df["cat"].value_counts(normalize = True) |
데이터프레임(DataFrame)
데이터프레임 객체의 경우 .drop_duplicates()
메서드로 중복된 행을 제거할 수 있다.
1 | df[["cat", "type"]].drop_duplicates() |
cat | type | |
---|---|---|
0 | food | A |
2 | snack | B |
3 | snack | C |
1 | len(df[["cat", "type"]].drop_duplicates()) |
.groupby()
메서드를 사용해서도 확인할 수 있다. 기준변수인 “cat”와 “type”에 대한 고유한 조합의 행과 그 행이 몇 개인지 확인하려면 기준변수가 아닌 다른 변수를 대상변수로 지정하고 뒤에 .count()
메서드를 사용하면 된다. 여기서는 “price” 변수를 대상변수로 사용하였다.
※ .groupby()
의 용법과 관련해서는 Pandas(GroupBy) 게시물에서 상세하게 다룬다.
1 | df.groupby(["cat", "type"])["price"].count().reset_index() |
cat | type | price | |
---|---|---|---|
0 | food | A | 2 |
1 | snack | B | 2 |
2 | snack | C | 1 |
상기의 코드는 .drop_duplicates()
결과보다 더 많은 정보를 보고자 할 때 사용할 수 있겠다. 그리고 Pandas의 crosstab()
함수를 사용해서도 비슷한 결과를 도출할 수 있으나 결과 객체를 다루기가 까다로워 별도로 소개하진 않았다.