Py) 기초 - Pandas(원소/조합 세기)

Py) 기초 - Pandas(원소/조합 세기)

파이썬 기반 데이터분석을 위하여 Pandas 객체의 고유한 원소 또는 행을 세는 것을 알아보고자 한다.


개요

고객 데이터에서 몇 명의 고객의 데이터가 있는지, 부서별 월별 실적 데이터에서 몇 개 부서의 데이터가 있는지 알아보려면 고객 또는 부서 관련

데이터 준비

다음과 같이 데이터를 준비한다.

1
2
3
4
5
df = pd.DataFrame({"cat": ["food", "food", "snack", "snack", "snack"],
"type": ["A", "A", "B", "C", "B"],
"price": [100, 100, 300, 200, 500],
"star": [3.1, 3.5, 4.3, 4, 3.9]})
df
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
2
len(set(df["cat"]))
## 2

시리즈 객체의 중복제거 메서드인 .unique()를 사용할 수 있다.

1
2
len(df["cat"].unique())
## 2

시리즈 객체의 고유한 원소 개수를 세는 메서드인 .nunique()를 사용할 수 있다.

1
2
df["cat"].nunique()
## 2

시리즈 객체의 고유한 원소별 개수를 세거나 비율을 계산하는 메서드인 .value_counts()를 사용할 수 있다.

1
2
3
4
df["cat"].value_counts()
## snack 3
## food 2
## Name: cat, dtype: int64

.value_counts()의 경우 “normalize” 인자에 True를 할당하면 고유한 원소가 시리즈 객체에서 차지하는 비율을 계산할 수 있다.

1
2
3
4
df["cat"].value_counts(normalize = True)
## snack 0.6
## food 0.4
## Name: cat, dtype: float64

데이터프레임(DataFrame)

데이터프레임 객체의 경우 .drop_duplicates() 메서드로 중복된 행을 제거할 수 있다.

1
df[["cat", "type"]].drop_duplicates()
cat type
0 food A
2 snack B
3 snack C
1
2
3
4
5
len(df[["cat", "type"]].drop_duplicates())
## 3

df[["cat", "type"]].drop_duplicates().shape[0]
## 3

.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() 결과보다 더 많은 정보를 보고자 할 때 사용할 수 있겠다. 그리고 Pandascrosstab() 함수를 사용해서도 비슷한 결과를 도출할 수 있으나 결과 객체를 다루기가 까다로워 별도로 소개하진 않았다.

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×