그룹 연산

2022. 11. 10. 20:47·Pandas
반응형

복잡한 데이터를 기준에 따라 그룹화해서 연산하는 것은 좋은 방법이다.

특정 기준을 적용해서 그룹으로 분할해서 처리하는 것을 그룹 연산이라고 부른다.

 

1
2
3
4
### 그룹 연산 ###
# 1단계. 분할 : 데이터를 특정 조건에 따라 분할
# 2단계. 적용 : 데이터를 필터링, 집계하는데 필요한 메소드 적용
# 3단계. 결합 : 데이터 처리 결과를 하나로 결합
cs

 

## 그룹 객체 만들기 ##

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
## 그룹 객체 만들기 (분할) ##
# grouby() 메소드 사용 #
# 특정 열을 기준으로 데이터프레임을 분할하여 그룹 객체를 반환하는 메소드 #
 
# 한 개의 열을 기준으로 그룹 만들기 #
 
df = titanic.loc[:, ['age', 'sex', 'class', 'fare', 'survived']]
print(df)
grouped = df.groupby(['class'])
# 'class' 열을 기준으로 그룹화한다.
 
print(grouped.mean()) # 그룹별 연산이 가능하다.
'''
              age       fare  survived
class
First   38.233441  84.154687  0.629630
Second  29.877630  20.662183  0.472826
Third   25.140620  13.675550  0.242363
'''
 
grouped_Second = grouped.get_group('Second')
# get_group() 를 사용해서 특정 그룹만 선택이 가능하다.
 
print(grouped_Second.head()) # Second 그룹만 선택 후 출력
'''
     age     sex   class     fare  survived
9   14.0  female  Second  30.0708         1
15  55.0  female  Second  16.0000         1
17   NaN    male  Second  13.0000         1
20  35.0    male  Second  26.0000         0
21  34.0    male  Second  13.0000         1
'''
 
 
# 여러 개의 열을 기준으로 그룹 만들기 #
# groupbu() 메소드에 여러 개의 리스트를 인자로 전달 #
# 멀티인덱스가 만들어진다 #
 
grouped_two = df.groupby(['class', 'sex'])
# 'class', 'sex' 열을 기준으로 그룹을 만든다.
# first - male / first - female / Second - male /...
# 이러한 순서로 총 6개의 그룹을 만든다.
 
 
for key, group in grouped_two:
    print('key : ', key)
    print('number : ', len(group))
    print(group.head(2))
    print('\n')
# 반복문으로 그룹의 내용 출력
    
    '''
    key :  ('First', 'female') 
number :  94
    age     sex  class     fare  survived
1  38.0  female  First  71.2833         1
3  35.0  female  First  53.1000         1
 
 
key :  ('First', 'male')
number :  122
     age   sex  class     fare  survived
6   54.0  male  First  51.8625         0
23  28.0  male  First  35.5000         1
 
 
key :  ('Second', 'female')
number :  76
     age     sex   class     fare  survived
9   14.0  female  Second  30.0708         1
15  55.0  female  Second  16.0000         1
 
 
key :  ('Second', 'male')
number :  108
     age   sex   class  fare  survived
17   NaN  male  Second  13.0         1
20  35.0  male  Second  26.0         0
 
 
key :  ('Third', 'female')
number :  144
    age     sex  class     fare  survived
2  26.0  female  Third   7.9250         1
8  27.0  female  Third  11.1333         1
 
 
key :  ('Third', 'male')
number :  347
    age   sex  class  fare  survived
0  22.0  male  Third  7.25         0
4  35.0  male  Third  8.05         0
'''
 
average_two = grouped_two.mean()
# 멀티인덱스를 가진 데이터프레임도 연산을 수행할 수 있다.
 
print(average_two)
'''
                     age        fare  survived
class  sex
First  female  34.611765  106.125798  0.968085
       male    41.281386   67.226127  0.368852
Second female  28.722973   21.970121  0.921053
       male    30.740707   19.741782  0.157407
Third  female  21.750000   16.118810  0.500000
       male    26.507589   12.661633  0.135447
'''
# First 석을 탄 여자의 생존율이 96%로 월등하게 높다.
 
group_3_female = grouped_two.get_group(('Third', 'female'))
# 멀티 인덱스를 이용해서 특정 그룹만 추출할 수 있다.
# 매개변수로 '튜플'을 넣는다. (멀티인덱스의 key는 튜플로 저장된다.)
 
print(group_3_female.head(3))
'''
     age     sex  class     fare  survived
2   26.0  female  Third   7.9250         1
8   27.0  female  Third  11.1333         1
10   4.0  female  Third  16.7000         1
'''
Colored by Color Scripter
cs

 

 

 

## 사용자 정의 함수 그룹에 적용하기 ##

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
## 사용자 정의 함수 그룹 객체에 적용하기 ##
# agg() 메소드 사용 #
 
def max_min(x):
    return x.max() - x.min()
# 최대값 - 최소값을 반환하는 사용자 정의 함수
 
agg_maxmin = grouped.agg(max_min)
# agg() 매개변수로 사용자 정의 함수를 넣어서 grouped 그룹에 적용
 
print(agg_maxmin)
'''
          age      fare  survived
class
First   79.08  512.3292         1
Second  69.33   73.5000         1
Third   73.58   69.5500         1
'''
 
 
# transform() 메소드 사용 #
# 원소에 함수를 적용하고 기존의 데이터프레임 형식으로 반환한다.
 
trans_age = grouped.age.transform(min)
 
print(trans_age)
'''
0      0.42
1      0.92
2      0.42
3      0.92
4      0.42
       ...
886    0.67
887    0.92
888    0.42
889    0.92
890    0.42
Name: age, Length: 891, dtype: float64
'''
Colored by Color Scripter
cs

 

반응형

'Pandas' 카테고리의 다른 글

피벗 테이블(Pivot_table)  (0) 2022.11.10
필터링  (0) 2022.11.09
함수 매핑  (1) 2022.11.09
데이터 전처리 - 시계열 데이터  (0) 2022.11.08
데이터 전처리 - 정규화  (0) 2022.11.08
'Pandas' 카테고리의 다른 글
  • 피벗 테이블(Pivot_table)
  • 필터링
  • 함수 매핑
  • 데이터 전처리 - 시계열 데이터
김천종
김천종
  • 김천종
    김천종
    김천종
  • 전체
    오늘
    어제
    • 분류 전체보기 (88)
      • 파이썬 (6)
      • Pandas (24)
      • 자료구조 (14)
      • 알고리즘 (4)
      • 아무거나 (16)
      • 머신러닝 (20)
      • ML 실습 (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
김천종
그룹 연산
상단으로

티스토리툴바