반응형
복잡한 데이터를 기준에 따라 그룹화해서 연산하는 것은 좋은 방법이다.
특정 기준을 적용해서 그룹으로 분할해서 처리하는 것을 그룹 연산이라고 부른다.
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
'''
|
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
'''
|
cs |
반응형
'Pandas' 카테고리의 다른 글
피벗 테이블(Pivot_table) (0) | 2022.11.10 |
---|---|
필터링 (0) | 2022.11.09 |
함수 매핑 (1) | 2022.11.09 |
데이터 전처리 - 시계열 데이터 (0) | 2022.11.08 |
데이터 전처리 - 정규화 (0) | 2022.11.08 |