√ 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)
Pandas 공식 웹사이트에서 세부기능 참조
https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.groupby.html
"어떤 데이터프레임을 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이 함께 명시됩니다
'Data Science > Pandas, Numpy' 카테고리의 다른 글
[Numpy] Flatten 기능 및 사용법 정리 (0) | 2022.09.29 |
---|---|
[Numpy] 열 Column간 순서, 위치 바꾸기 (0) | 2022.09.29 |
[Numpy] 넘파이 범용/유틸리티 함수 정리 (0) | 2022.09.28 |
[Numpy] 넘파이 개념 및 필수 함수 정리 (0) | 2022.09.27 |
[Pandas] Reset_index, set_index 비교 (0) | 2022.09.21 |
댓글