AI/Pandas

Group by

LTSGOD 2023. 3. 12. 11:02

- sql 의 group by 와 같다! 

 

df.groupby("Team")["Points"].sum()

위의 결과는 Team들의 Points들의 합을 반환한다.

df.groupby(["Tema","Year"])["Points"].sum()

여러 Column들을 groupby 할 수도 있다.

 

Groupby 한 결과물은 multilevel index를 가진다.

>>> sum_wegiht = grouped["Weight"].sum()
>>> sum_wegiht


Animal  Age
Cat     2      10
        4      15
        6      12
Dog     1      30
        3      25
        5      20
Name: Weight, dtype: int64

>>> sum_wegiht.index
MultiIndex([('Cat', 2),
            ('Cat', 4),
            ('Cat', 6),
            ('Dog', 1),
            ('Dog', 3),
            ('Dog', 5)],
           names=['Animal', 'Age'])


>>> type(sum_wegiht)
<class 'pandas.core.series.Series'>

이 때 결과물의 타입은 Series 타입이다.

 

unstack()

 

  Pandas에서 unstack() 함수는 Hierarchical index를 가진 데이터를 피벗 테이블 형태로 변환하는 함수입니다. 즉, 열 인덱스의 마지막 레벨을 행 인덱스로 이동시킵니다. 이를 통해 데이터를 다차원 배열 형태로 쉽게 확인할 수 있습니다.

 

>>> sum_wegiht.unstack()        

Age        1     2     3     4     5     6 
Animal                                     
Cat      NaN  10.0   NaN  15.0   NaN  12.0 
Dog     30.0   NaN  25.0   NaN  20.0   NaN 


>>> type(sum_wegiht.unstack())             
<class 'pandas.core.frame.DataFrame'>

 

swaplevel 함수

 

  Pandas에서 swaplevel() 함수는 Hierarchical index를 가진 데이터프레임에서 레벨을 바꿀 수 있는 함수입니다. 즉, 인덱스 레벨을 서로 교환할 수 있습니다. 이를 통해 데이터를 다양한 형태로 확인할 수 있습니다.

 

>>> sum_wegiht.swaplevel()


Age  Animal
2    Cat       10
4    Cat       15
6    Cat       12
1    Dog       30
3    Dog       25
5    Dog       20
Name: Weight, dtype: int64

 

 

reset_index()

 

>>> sum_wegiht.reset_index()

  Animal  Age  Weight
0    Cat    2      10
1    Cat    4      15
2    Cat    6      12
3    Dog    1      30
4    Dog    3      25
5    Dog    5      20

인덱스를 다시 풀어준다.

 

요약

df.groupby([column]) column 기준으로 group으로 묶어준다.
여기서의 df는 모두 Hierarchical Index를 가진 data를 말한다.
df.unstack() pivot table로 변환해준다.
df.swaplevel()  level을 서로 바꾼다.
df.sort_index(level = 1) 레벨 인덱스를 기준으로 데이터프레임 정렬한다.
df.sort_values() value값 기준으로 정
df.reset_index() index를 다시 만들어준다.
ss.sum(level = 0) series기 때문에 함수사용가능, Index level 기준으로 기본연산 수행가능

groupby는 Split상태에서 추출이 가능하다.

grouped = df.groupby("Animal")

for name, group in grouped:
    print(name)
    print(group)


Cat
  Animal  Age  Weight
2    Cat    2      10
3    Cat    4      15
5    Cat    6      12
Dog
  Animal  Age  Weight
0    Dog    3      25
1    Dog    5      20
4    Dog    1      30

 

get_group

>>> grouped.get_group("Cat")

  Animal  Age  Weight
2    Cat    2      10
3    Cat    4      15
5    Cat    6      12

group 객체에서 해당 그룹의 정보를 가져온다. 위에서는 Cat의 정보를 가져왔다.

 

 

Aggregation -> 요약된 추출정보를 추출해준다.

data = {'Animal': ['Dog', 'Cat', 'Dog', 'Cat', 'Dog', 'Cat'],
    'Age': [3, 2, 5, 4, 1, 6],                           
    'Weight': [25, 10, 20, 15, 30, 12]}  
    
df = pd.DataFrame(data)                                      
grouped = df.groupby('Animal')                               
result = grouped.agg({'Age': 'mean', 'Weight': 'mean'})      

>>>result                                                       
        Age     Weight                                           
Animal                                                           
Cat     4.0  12.333333                                           
Dog     3.0  25.000000

마찬가지로 group객체에서 사용가능하다. 여러개의 합산정보를 가져올 수 있다. 위의 코드는 합과 평균을 반환하는 코드이다.

 

 

 

Transformation

 

transform() 메서드는 GroupBy 객체와 함께 사용되어, 그룹화된 데이터에 대해 각 그룹별로 적용된 결과를 반환합니다.

 

transform() 메서드는 apply() 메서드와 유사하게 동작하지만, 반환되는 객체의 형태가 다릅니다. apply() 메서드는 원본 DataFrame의 모양과 크기를 그대로 유지하지만, transform() 메서드는 각 그룹 내에서 계산된 결과를 그룹의 크기와 같은 형태로 반환합니다.

 

grouped = df.groupby('Animal')
result = grouped.transform('mean')

print(result)

   Age  Weight
0  3.0    25.0
1  4.0    12.3
2  3.0    25.0
3  4.0    12.3
4  3.0    25.0
5  4.0    12.3

  transform() 메서드를 사용하여 GroupBy 객체에서 각 그룹에서 계산된 값을 반환할 수 있습니다. 반환되는 객체의 형태는 그룹의 크기와 같으며, apply() 메서드와 달리 각 그룹에서 계산된 값을 원본 DataFrame과 같은 위치에 배치합니다.

 

Filter

 

  이 메서드는 GroupBy 객체와 함께 사용되어, 각 그룹에서 조건에 따라 특정 데이터를 선택하여 반환합니다.

 

  filter() 메서드는 조건 함수를 사용하여 각 그룹의 데이터를 필터링합니다. 조건 함수는 불리언 값을 반환하며, 그룹의 데이터 중에서 조건이 참인 데이터만 선택하여 반환합니다.

grouped = df.groupby('Animal')
result = grouped.filter(lambda x: x['Age'].mean() > 3)

print(result)

  Animal  Age  Weight
2    Dog    5      20
5    Cat    6      12
group.get_group 그룹의 정보를 가져온다.
group.agg() 요약된 추출정보 제공
group.transform(function) 데이터 변환
group.filter(function) function에 맞는 값들 filtering 해서 보여줌.