본문 바로가기
Data Science/Pandas, Numpy

[Pandas] Groupby / Count / Value_counts 차이점 정리

by Queen2 2022. 9. 22.
728x90
반응형

√ DataFrame.groupby

데이터프레임의 그룹핑은 groupby를 통해 비교적 간단하게 실행이 가능한데요

DataFrame.groupby(by=None, axis=0,
 level=None, as_index=True, sort=True,
 group_keys=_NoDefault.no_default, squeeze=_NoDefault.no_default, observed=False, dropna=True)

"어떤 데이터프레임을 by 무엇으로 axis 행/열을 기준으로 묶겠다" 를 생각하면서 작성하면 좀 수월한 것 같습니다

 

 

그룹핑 예시)

>>> df
   Animal  Max Speed
0  Falcon      380.0
1  Falcon      370.0
2  Parrot       24.0
3  Parrot       26.0
>>> df.groupby(['Animal']).mean()
        Max Speed
Animal
Falcon      375.0
Parrot       25.0

 

 


 

√ 그룹핑한 데이터 Count 하기

 

캐글을 보다보면 컬럼과 관련된 데이터 수가 몇개 있는지 보기 위해서 그룹핑 조건에 맞는 개수를 세는 일이 빈번히

발생하는데요! 어떻게 수를 세고 데이터 프레임으로 변환하는지 알아봅시다

 

▶ 그룹핑 카운트를 데이터 프레임화 하기

 

pd.DataFrame({'count' : df.groupby(['a', 'b'])['a'].size()}).reset_index()

위는 케글에서 가져온 코드를 좀 수정한건데요, 아래처럼 결과를 깔끔한 데이터프레임으로 보기 위해서는

pd.DataFrame()으로 데이터프레임화 시키고 내부에 groupby한 데이터를 size를 통해 count 해줬는데요

 

 

그렇다면, 여기서 나온 size와 일반적으로 사용하는

count, series에 사용하는 value_counts는 어떤 차이점이 있을까요?

 

 .count와 .size의  value_counts 차이점

 

DataFrame.count / Series.count

DataFrame.count(axis=0, level=None, numeric_only=False)

 

count는 DataFrame과 Series 모두에서 사용가능한데요

단, 여기서 주의할 점은 NaN 값은 카운팅하지 않는다!는 점입니다

 

Df . count ==> 각 컬럼에 있는 데이터의 수를 카운팅한다

Series.count ==> Series에 있는 데이터의 수를 리턴한다

 

>>> df = pd.DataFrame({"Person":
...                    ["John", "Myla", "Lewis", "John", "Myla"],
...                    "Age": [24., np.nan, 21., 33, 26],
...                    "Single": [False, True, True, True, False]})
>>> df
   Person   Age  Single
0    John  24.0   False
1    Myla   NaN    True
2   Lewis  21.0    True
3    John  33.0    True
4    Myla  26.0   False

>>> df.count()
Person    5
Age       4
Single    5
dtype: int64

>>> df['Age'].count()
4

 


 

DataFrame.size / Series.size

size역시 데이터프레임과 시리즈 모두에 사용가능한데요

이름이 사이즈인만큼 size는 객체에 있는 모든 데이터의 수를 세어준다!고 보면 좋을 것 같아요 

 

단, 여기서 주의할 점은 NaN 값도 함께 센다는 점입니다

>>> s = pd.Series({'a': 1, 'b': 2, 'c': 3})
>>> s.size
3

>>> df = pd.DataFrame({'col1': [1, 2], 'col2': [3, 4]})
>>> df.size
4

(Source: pandas.pydata.org)

 

예시를 보면 Series.size는 행의 개수를 반환하고

DataFrame.size는 행*열을 계산한 전체 데이터의 수가 나온걸 알 수 있죠?

 

 


 

Series.value_counts

Series.value_counts(normalize=False, sort=True, ascending=False, bins=None, dropna=True)

 

value_counts는 Series에 있는 Unique한 value를 센다는 차이점을 가지는데요

(기본적으로 dropna = True로 NA를 포함하지 않습니다)

 

세부기능이 유용하게 활용될 수 있어서 한번 짚고 넘어가겠습니다!

 

>>> s = pd.Series([3, 1, 2, 3, 4, np.nan])
>>> s.value_counts(normalize=True)
3.0    0.4
1.0    0.2
2.0    0.2
4.0    0.2
dtype: float64

#normalize는 각 value의 개수 / 전체 value의 개수를 통해 
각 데이터가 어떤 비율로 있는지 좀 더 명시적으로 볼 수 있습니다

>>> s.value_counts(bins=3)
(0.996, 2.0]    2
(2.0, 3.0]      2
(3.0, 4.0]      1
dtype: int64

#bins는 데이터의 구간을 나눠줌으로써, 연속적인 데이터나 카테고리가 분류된 데이터에서 사용가능합니다

>>> s.value_counts(dropna=False)
3.0    2
1.0    1
2.0    1
4.0    1
NaN    1
dtype: int64

#default로 true가 되어있는 옵션을 False로 바꾸면 NaN이 함께 명시됩니다
728x90
반응형

댓글