Pandas 데이터 결합 & 요약
Table of contents
Merge, Join, Concatenate
pd.merge(df1, df2)
df1 = pd.DataFrame({'customer_id': [1001, 1002, 1003, 1004, 1005],
'name': ['Annie', 'Chloe', 'Jacob', 'David', 'Ellie'],
'sex': ['F', 'F', 'M', 'M', 'F']})
df2 = pd.DataFrame({'customer_id': [1001, 1001, 1005, 1004, 1002, 1008],
'amount_spent': [10000, 20000, 12000, 5000, 30000, 35000]})
print(df1, '\n')
print(df2)
customer_id name sex
0 1001 Annie F
1 1002 Chloe F
2 1003 Jacob M
3 1004 David M
4 1005 Ellie F
customer_id amount_spent
0 1001 10000
1 1001 20000
2 1005 12000
3 1004 5000
4 1002 30000
5 1008 35000
- inner join (default): 두 DataFrame에 모두 데이터가 존재하는 행만 남는다
pd.merge(df1, df2) # 보통 default로 'inner join' 방식이 사용되며, 자동으로 이름이 같은 column을 기준으로 merge된다
customer_id name sex amount_spent 0 1001 Annie F 10000 1 1001 Annie F 20000 2 1002 Chloe F 30000 3 1004 David M 5000 4 1005 Ellie F 12000 - ‘on’으로 통합할 열 지정
pd.merge(df1, df2, on='customer_id') # on에 어떤 열을 기준으로 통합할 것인지 지정해줄 수 있다. (두 df에 모두 존재하는 열이여야 함) ## 이 예시에서는 상관 없지만, 기준 열이 아니면서 이름이 같은 열이 2개 이상일 경우에는 꼭 on을 지정해줘야 함
customer_id name sex amount_spent 0 1001 Annie F 10000 1 1001 Annie F 20000 2 1002 Chloe F 30000 3 1004 David M 5000 4 1005 Ellie F 12000 - outer join: 어느 한 쪽의 DataFrame에만 있는 값이라도 다 보여주는 방식
pd.merge(df1, df2, how='outer') # 한 쪽에만 데이터가 있다면, 반대쪽 DataFrame의 해당 부분은 NaN으로 채워짐
customer_id name sex amount_spent 0 1001 Annie F 10000 1 1001 Annie F 20000 2 1002 Chloe F 30000 3 1003 Jacob M NaN 4 1004 David M 5000 5 1005 Ellie F 12000 6 1008 NaN NaN 35000 - left outer join: 왼쪽 DataFrame (df1)에 존재하는 값을 기준으로 merge
pd.merge(df1, df2, how='left')
customer_id name sex amount_spent 0 1001 Annie F 10000 1 1001 Annie F 20000 2 1002 Chloe F 30000 3 1003 Jacob M NaN 4 1004 David M 5000 5 1005 Ellie F 12000 - right outer join: 오른쪽 DataFrame (df2)에 존재하는 값을 기준으로 merge
pd.merge(df1, df2, how='right')
customer_id name sex amount_spent 0 1001 Annie F 10000 1 1001 Annie F 20000 2 1005 Ellie F 12000 3 1004 David M 5000 4 1002 Chloe F 30000 5 1008 NaN NaN 35000 - 키가 되는 기준열의 이름이 두 데이터프레임에서 다른 경우
df1 = pd.DataFrame({'customer_id': [1001, 1002, 1003, 1004, 1005], 'name': ['Annie', 'Chloe', 'Jacob', 'David', 'Ellie'], 'sex': ['F', 'F', 'M', 'M', 'F']}) df3 = pd.DataFrame({'customer': ['Chloe', 'Jacob', 'Ellie', 'Haley', 'Serene'], 'VIP_type': ['VIP', 'Gold', 'VIP', 'Silver', 'Gold']}) print(df1, '\n') print(df3)
customer_id name sex 0 1001 Annie F 1 1002 Chloe F 2 1003 Jacob M 3 1004 David M 4 1005 Ellie F customer VIP_type 0 Chloe VIP 1 Jacob Gold 2 Ellie VIP 3 Haley Silver 4 Serene Gold
# 키가 되는 기준열의 이름이 두 데이터프레임에서 다른 경우: left_on, right_on 인수를 사용하여 기준열을 명시
pd.merge(df1, df3, left_on='name', right_on="customer") # default: inner join
customer_id name sex customer VIP_type 0 1002 Chloe F Chloe VIP 1 1003 Jacob M Jacob Gold 2 1005 Ellie F Ellie VIP
df1.join(df2)
- join 메소드를 사용해도 merge와 같은 결과를 낼 수 있다
- 하지만 join()은 index를 기준으로 결합하는 것이 기본이고, how=’left’가 default다
# join을 쓰기 위해, df1과 df2 모두 결합할 기준이 되는 열인 'customer_id'를 index로 지정해준다
df1.set_index('customer_id', inplace=True)
df2.set_index('customer_id', inplace=True)
print(df1, '\n')
print(df2)
name sex
customer_id
1001 Annie F
1002 Chloe F
1003 Jacob M
1004 David M
1005 Ellie F
amount_spent
customer_id
1001 10000
1001 20000
1005 12000
1004 5000
1002 30000
1008 35000
- left outer join (default)
df1.join(df2) # how='left'가 default값
customer_id name sex amount_spent 1001 Annie F 10000 1001 Annie F 20000 1002 Chloe F 30000 1003 Jacob M NaN 1004 David M 5000 1005 Ellie F 12000 - inner join
df1.join(df2, how='inner') # how에 'right', 'outer', 'innner' 모두 사용 가능
customer_id name sex amount_spent 1001 Annie F 10000 1001 Annie F 20000 1002 Chloe F 30000 1004 David M 5000 1005 Ellie F 12000
pd.concat([df1, df2])
- 기준 열(key column)을 사용하지 않고 단순히 데이터를 연결(concatenate)한다
- 기본적으로는 위/아래로 데이터 행을 연결하며, axis=1로 인수를 설정하면 옆으로 연결해준다
import numpy as np
df1 = pd.DataFrame(
np.arange(6).reshape(3, 2),
columns=['a', 'b'])
df2 = pd.DataFrame(
5 + np.arange(6).reshape(2,3),
columns=['a', 'b', 'c'])
print(df1, '\n')
print(df2)
a b
0 0 1
1 2 3
2 4 5
a b c
0 5 6 7
1 8 9 10
- 위 아래로 연결 (default)
pd.concat([df1, df2]) ## 위 아래로 연결됨. (column명 기준)
a b c 0 0 1 NaN 1 2 3 NaN 2 4 5 NaN 0 5 6 7 1 8 9 10 +) 그냥 이어붙이면 행 인덱스번호도 그대로 가져오기에,
ignore_index=True
로 인덱스를 재배열할 수 있다pd.concat([df1, df2], ignore_index=True)
a b c 0 0 1 NaN 1 2 3 NaN 2 4 5 NaN 3 5 6 7 4 8 9 10 - 옆으로 연결:
axis=1
설정pd.concat([df1, df2], axis=1) # axis=1로 설정해주면, 옆으로 연결된다 (index 기준)
a b a b c 0 0 1 5 6 7 1 2 3 8 9 10 2 4 5 NaN NaN NaN - Series 간 결합
sr1 = pd.Series(['e0','e1','e2','e3'], name = 'e') sr2 = pd.Series(['g0','g1','g2','g3'], name = 'g') result1 = pd.concat([sr1, sr2], axis = 1) #열방향 연결, type = 데이터프레임이 됨 print(result1, '\n') result2 = pd.concat([sr1, sr2], axis = 0) #행방향 연결, type = 시리즈 print(result2, '\n') ## 사실, pd.concat([sr1, sr2], axis = 0)는 sr1.append(sr2)와 동일한 결과 result3 = sr1.append(sr2) #이렇게 하면 행방향 concat과 동일 print(result3)
e g 0 e0 g0 1 e1 g1 2 e2 g2 3 e3 g3 0 e0 1 e1 2 e2 3 e3 0 g0 1 g1 2 g2 3 g3 dtype: object 0 e0 1 e1 2 e2 3 e3 0 g0 1 g1 2 g2 3 g3 dtype: object
+) 참고) pd.merge()는 Series간 결합에는 사용할 수 없다. (공통의 column이 있어야 하는 게 전제조건)
pd.merge(sr1, sr2) ## series끼리 merge하려고 하면 error.
MergeError Traceback (most recent call last) <ipython-input-43-176c5dc5c9a2> in <module>() ----> 1 pd.merge(sr1, sr2)
데이터 요약 집계
df.groupby()
: 그룹별로 요약해서 집계하기
titanic_df = pd.read_csv('data/titanic.csv') ## 데이터 출처: kaggle
titanic_df.head()
PassengerId | Survived | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 0 | 3 | Braund, Mr. Owen Harris | male | 22 | 1 | 0 | A/5 21171 | 7.25 | nan | S |
1 | 2 | 1 | 1 | Cumings, Mrs. John Bradley (Florence Briggs Thayer) | female | 38 | 1 | 0 | PC 17599 | 71.2833 | C85 | C |
2 | 3 | 1 | 3 | Heikkinen, Miss. Laina | female | 26 | 0 | 0 | STON/O2. 3101282 | 7.925 | nan | S |
3 | 4 | 1 | 1 | Futrelle, Mrs. Jacques Heath (Lily May Peel) | female | 35 | 1 | 0 | 113803 | 53.1 | C123 | S |
4 | 5 | 0 | 3 | Allen, Mr. William Henry | male | 35 | 0 | 0 | 373450 | 8.05 | nan | S |
- df.groupby(‘칼럼명’).함수()
- DataFrame에 groupby()를 호출해 반환된 결과에 aggregation 함수를 호출하면, groupby() 대상 칼럼을 제외한 모든 칼럼에 aggregation 함수를 적용한 결과를 보여준다
- aggregation 함수 종류: count, sum, max, mean, nunique 등. (*nunique: unique count)
- 대상 칼럼이 index로 들어감
# 'Pclass' 기준으로 데이터 수를 집계 titanic_df.groupby('Pclass').count() ## 3등석이 가장 사람이 많음을 유추 가능.
Pclass PassengerId Survived Name Sex Age SibSp Parch Ticket Fare Cabin Embarked 1 216 216 216 216 186 216 216 216 216 176 214 2 184 184 184 184 173 184 184 184 184 16 184 3 491 491 491 491 355 491 491 491 491 12 491 - as_index=False: 대상 칼럼이 index가 아닌 칼럼으로 들어감
# 이렇게 as_index=False를 넣어주면 index가 아닌 칼럼으로 들어감 titanic_df.groupby('Pclass', as_index=False).count()
Pclass PassengerId Survived Name Sex Age SibSp Parch Ticket Fare Cabin Embarked 0 1 216 216 216 216 186 216 216 216 216 176 214 1 2 184 184 184 184 173 184 184 184 184 16 184 2 3 491 491 491 491 355 491 491 491 491 12 491 -
특정 칼럼만 필터링해서 함수 적용
titanic_df.groupby('Pclass')[['PassengerId', 'Survived']].count()
Pclass PassengerId Survived 1 216 216 2 184 184 3 491 491 +) 이렇게 하는 것도 가능:
titanic_df.groupby('Pclass', as_index=False)[['PassengerId', 'Survived']].count()
Pclass PassengerId Survived 0 1 216 216 1 2 184 184 2 3 491 491 - 여러 개의 aggregation 함수를 적용
- 적용하려는 함수명을 agg( ) 내에 인자로 입력해서 사용해야 함
titanic_df.groupby('Pclass')['Age'].agg([max, min])
Pclass max min 1 80 0.92 2 70 0.67 3 74 0.42 -
여러 칼럼에 여러 aggregation 함수 적용
titanic_df.groupby('Pclass')[['Age', 'Fare', 'SibSp']].agg([max, min])
Age Fare SibSp Pclass max min max min max min 1 80 0.92 512.329 0 3 0 2 70 0.67 73.5 0 3 0 3 74 0.42 69.55 0 8 0 - 여러 칼럼에 서로 다른 Aggregation 함수를 적용
- dictionary 형태로 함수를 적용할 칼럼과 함수명을 입력
- ※ aggregation 방식 중 nunique의 경우,
'Age': pd.Series.nunique
와 같은 방식으로 표기해줘야 한다
agg_format = {'Age':'max', 'SibSp':'sum', 'Fare':'mean'} titanic_df.groupby('Pclass').agg(agg_format)
Pclass Age SibSp Fare 1 80 90 84.1547 2 70 74 20.6622 3 74 302 13.6756
+) string value groupby
# sample dataframe 생성: 이용자와 이용한 앱이 매칭되어 있는 데이터
users = ['A', 'B', 'A', 'B', 'C', 'D', 'E', 'D', 'E']
apps_used = ['Google', 'Naver', 'YouTube', 'Google', 'YouTube', 'Facebook', 'Instagram', 'Naver', 'Google']
sample_df = pd.DataFrame({'users':users, 'apps_used':apps_used})
sample_df
users | apps_used | |
---|---|---|
0 | A | |
1 | B | Naver |
2 | A | YouTube |
3 | B | |
4 | C | YouTube |
5 | D | |
6 | E | |
7 | D | Naver |
8 | E |
- list로 묶기: 각 이용자별 이용한 앱 조합
sample_df.groupby('users')['apps_used'].apply(list)
users A [Google, YouTube] B [Naver, Google] C [YouTube] D [Facebook, Naver] E [Instagram, Google] Name: apps_used, dtype: object
- set으로 묶기: 순서 고려X
sample_df.groupby('users')['apps_used'].apply(set)
users A {Google, YouTube} B {Google, Naver} C {YouTube} D {Facebook, Naver} E {Google, Instagram} Name: apps_used, dtype: object
- apply lambda를 활용해 원하는 모양으로 결합
sample_df.groupby('users')['apps_used'].apply(lambda x: ', '.join(x))
users A Google, YouTube B Naver, Google C YouTube D Facebook, Naver E Instagram, Google Name: apps_used, dtype: object
pd.pivot_table()
: 엑셀에서처럼 pivot 돌리기 (엑셀에서 pivot 돌리는 것의 동작 방식을 생각하면 쉬움)
- ex)
pd.pivot_table(df, index='칼럼1', columns=['칼럼2','칼럼3'], values='칼럼4', fill_value=0, aggfunc='sum')
- index(열)나 columns(행)에 str 하나만 넣어도 되고, [ ] 리스트 형태로 여러 개 넣으면 multiindex / multiheader되는 것
- values가 실제 pivot을 채울 값
- aggfunc에는 집계 함수를 적어 줌. - ‘sum’이면 합산 / ‘mean’이면 평균
- fill_value=0은 NaN 값들을 0으로 채워서 return하겠다는 뜻
titanic_df.head()
PassengerId | Survived | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 0 | 3 | Braund, Mr. Owen Harris | male | 22 | 1 | 0 | A/5 21171 | 7.25 | nan | S |
1 | 2 | 1 | 1 | Cumings, Mrs. John Bradley (Florence Briggs Thayer) | female | 38 | 1 | 0 | PC 17599 | 71.2833 | C85 | C |
2 | 3 | 1 | 3 | Heikkinen, Miss. Laina | female | 26 | 0 | 0 | STON/O2. 3101282 | 7.925 | nan | S |
3 | 4 | 1 | 1 | Futrelle, Mrs. Jacques Heath (Lily May Peel) | female | 35 | 1 | 0 | 113803 | 53.1 | C123 | S |
4 | 5 | 0 | 3 | Allen, Mr. William Henry | male | 35 | 0 | 0 | 373450 | 8.05 | nan | S |
-
기본 예시
pd.pivot_table(titanic_df, # 피벗할 데이터프레임 index='Pclass', # 행 위치에 들어갈 열 columns='Sex', # 열 위치에 들어갈 열 values='Age', # 데이터로 사용할 열 aggfunc='mean') # 데이터 집계함수
Sex female male Pclass 1 34.6118 41.2814 2 28.723 30.7407 3 21.75 26.5076 - 여러 개의 데이터 집계함수 넣기
pd.pivot_table(titanic_df, index='Pclass', columns='Sex', values='Survived', aggfunc=['mean', 'sum'])
mean sum Sex female male female male Pclass 1 0.968085 0.368852 91 45 2 0.921053 0.157407 70 17 3 0.5 0.135447 72 47 - 많은 칼럼을 동시에 인자로 입력
-
index=
,columns=
,values=
에 모두 list 형태로 여러 개의 칼럼을 인자로 넣을 수 있다
pd.pivot_table(titanic_df, index=['Pclass', 'Sex'], columns='Survived', values=['Age', 'Fare'], aggfunc=['mean', 'max'])
mean max Age Fare Age Fare Survived 0 1 0 1 0 1 0 1 Pclass Sex 1
female 25.6667 34.939 110.604 105.978 50 63 151.55 512.329 male 44.582 36.248 62.8949 74.6373 71 80 263 512.329 2
female 36 28.0809 18.25 22.289 57 55 26 65 male 33.369 16.022 19.489 21.0951 70 62 73.5 39 3
female 23.8182 19.3298 19.7731 12.4645 48 63 69.55 31.3875 male 27.2558 22.2742 12.2045 15.5797 74 45 69.55 56.4958 -
df.pivot()
: 데이터 형태를 변경해준다. 원하는 형태로 데이터를 변형해준다는 점에서 pd.pivot_table
과 유사하지만, pivot_table과 달리 데이터를 요약 집계해주는 기능은 없음
pivot_sample = titanic_df.groupby(['Pclass', 'Sex'])[['Fare']].mean().reset_index()
pivot_sample
Pclass | Sex | Fare | |
---|---|---|---|
0 | 1 | female | 106.126 |
1 | 1 | male | 67.2261 |
2 | 2 | female | 21.9701 |
3 | 2 | male | 19.7418 |
4 | 3 | female | 16.1188 |
5 | 3 | male | 12.6616 |
→ ‘Pclass’ 정보가 index로, ‘Sex’ 정보가 column으로, 그리고 ‘Fare’가 value로 들어가도록 reshape:
pivot_sample.pivot(index='Pclass', columns='Sex', values='Fare')
Pclass | female | male |
---|---|---|
1 | 106.126 | 67.2261 |
2 | 21.9701 | 19.7418 |
3 | 16.1188 | 12.6616 |
Multi-Index, Multi-Header 다루기
: groupby나 pivot_table로 데이터를 요약 집계하다 보면, multi-index나 multi-header를 다루게 된다
Multi-Index 다루기
gdf = titanic_df.groupby(['Pclass', 'Sex'])[['Age', 'Fare', 'Survived']].mean()
gdf
Age | Fare | Survived | ||
---|---|---|---|---|
Pclass | Sex | |||
1
|
female | 34.6118 | 106.126 | 0.968085 |
male | 41.2814 | 67.2261 | 0.368852 | |
2
|
female | 28.723 | 21.9701 | 0.921053 |
male | 30.7407 | 19.7418 | 0.157407 | |
3
|
female | 21.75 | 16.1188 | 0.5 |
male | 26.5076 | 12.6616 | 0.135447 |
- 인덱싱: 1st level
# [Pclass]열의 [1]행만 인덱싱 (index_number=1이 아니라, 인덱스 이름이 1) gdf.loc[1] ## 1은 int 타입이라서 '1'이라고 쓰지 않음
Sex Age Fare Survived female 34.6118 106.126 0.968085 male 41.2814 67.2261 0.368852 - 인덱싱: 1st level - 2nd level (순서대로, 차근차근)
# [Pclass]열의 [1]행 중, [Sex] 열의 [female]행만 인덱싱 (순서: 1, female) ## 이렇게 tuple 형태로 넣어주려면, 더 밖에 있는 index부터 차근차근 접근해야 한다 gdf.loc[(1, 'female')] ## pivot_df.loc[1].loc['female'] 이렇게 해도 동일한 결과.
Age 34.611765 Fare 106.125798 Survived 0.968085 Name: (1, female), dtype: float64
- 인덱싱: 2nd level에 바로 접근
- 멀티인덱서 xs를 이용하면 그룹 범주와 상관 없이 수준(level)만 명시해주면 인덱싱이 가능 (cf.loc와 iloc를 이용하려면 큰 그룹부터 순차적으로 인덱싱을 해야 함)
# Sex그룹의 male값을 갖는 행을 모두 추출, 즉 등급(class)별 male에 대한 자료를 인덱싱 gdf.xs('male', level='Sex')
Pclass Age Fare Survived 1 41.2814 67.2261 0.368852 2 30.7407 19.7418 0.157407 3 26.5076 12.6616 0.135447 +)
level=
에는 인덱스명을 적어줘도 되고, 해당 인덱스의 레벨을 int로 넣어줘도 된다. (0부터 시작)## 'Sex' level은 두번째 level이므로, level=1이라고 넣어줘도 위와 같은 결과. gdf.xs('male', level=1)
-
멀티 인덱스 해제:
reset_index()
활용gdf.reset_index()
Pclass Sex Age Fare Survived 0 1 female 34.6118 106.126 0.968085 1 1 male 41.2814 67.2261 0.368852 2 2 female 28.723 21.9701 0.921053 3 2 male 30.7407 19.7418 0.157407 4 3 female 21.75 16.1188 0.5 5 3 male 26.5076 12.6616 0.135447
Multi-Header 다루기
gdf2 = titanic_df.groupby('Pclass')[['Age', 'Fare']].agg(['mean', 'max'])
gdf2
Age | Fare | |||
---|---|---|---|---|
mean | max | mean | max | |
Pclass | ||||
1 | 38.2334 | 80 | 84.1547 | 512.329 |
2 | 29.8776 | 70 | 20.6622 | 73.5 |
3 | 25.1406 | 74 | 13.6756 | 69.55 |
-
인덱싱: 1st level
# 'Age' 열을 indexing gdf2['Age']
Pclass mean max 1 38.2334 80 2 29.8776 70 3 25.1406 74 -
인덱싱: 1st level - 2nd level (순서대로, 차근차근)
# 'Age' 열의 'mean' 열을 indexing gdf2['Age']['mean'] ## gdf2[('Age', 'mean')] 이렇게 넣어줘도 동일한 결과.
Pclass 1 38.233441 2 29.877630 3 25.140620 Name: mean, dtype: float64
- 인덱싱: 2nd level에 바로 접근
- 열 방향 멀티인덱싱에도 xs를 사용 –
axis=1
이라고 하면 열 방향을 의미
# 'mean' 행을 모두 추출 -- 'Age'와 'Fare'의 'mean'을 모두 추출 gdf2.xs('mean', level=1, axis=1)
Pclass Age Fare 1 38.2334 84.1547 2 29.8776 20.6622 3 25.1406 13.6756 - 열 방향 멀티인덱싱에도 xs를 사용 –
-
멀티 헤더 해제: column명을 아래와 같이 새로 넣어주면 된다
# 이렇게 column명을 넣어주면 된다 (두 레벨의 칼럼명을 모두 담은 이름으로 적어야 좋음) gdf2.columns = ['Age_mean', 'Age_max', 'Fare_mean','Fare_max'] gdf2
Pclass Age_mean Age_max Fare_mean Fare_max 1 38.2334 80 84.1547 512.329 2 29.8776 70 20.6622 73.5 3 25.1406 74 13.6756 69.55 +)
map
사용해서 새로운 칼럼명 생성하기gdf2.columns = gdf2.columns.map('{0[0]}_{0[1]}'.format) # column1_column2의 형태로 새 column명을 생성해줌 gdf2
Pclass Age_mean Age_max Fare_mean Fare_max 1 38.2334 80 84.1547 512.329 2 29.8776 70 20.6622 73.5 3 25.1406 74 13.6756 69.55
unstack, stack으로 pivot
df.unstack()
: index의 특정 level을 column 방향으로 pivot해주는 함수 (multi-index를 풀어준다)
gdf3 = titanic_df.groupby(['Pclass', 'Sex'])[['Age']].mean()
gdf3
Age | ||
---|---|---|
Pclass | Sex | |
1
|
female | 34.6118 |
male | 41.2814 | |
2
|
female | 28.723 |
male | 30.7407 | |
3
|
female | 21.75 |
male | 26.5076 |
- level=0: 1st level 인덱스를 column 방향으로 pivot
gdf3.unstack(level=0)
Age Pclass 1 2 3 Sex female 34.6118 28.723 21.75 male 41.2814 30.7407 26.5076 -
level=1: 2nd level 인덱스를 column 방향으로 pivot
gdf3.unstack(level=1)
Age Sex female male Pclass 1 34.6118 41.2814 2 28.723 30.7407 3 21.75 26.5076 +) 이 경우, 2nd level이 마지막 level이므로,
level=-1
라고 적어도 동일한 결과
df.stack()
: column의 특정 level을 index 방향으로 pivot해주는 함수 (unstack과 반대: multi-index를 만들어준다)
gdf4 = titanic_df.groupby('Pclass')[['Age']].agg(['mean', 'max'])
gdf4
Age | ||
---|---|---|
mean | max | |
Pclass | ||
1 | 38.2334 | 80 |
2 | 29.8776 | 70 |
3 | 25.1406 | 74 |
→ 2번째 level (마지막 level)을 index 방향으로 pivot
gdf4.stack(level=-1)
Age | ||
---|---|---|
Pclass | ||
1
|
mean | 38.2334 |
max | 80 | |
2
|
mean | 29.8776 |
max | 70 | |
3
|
mean | 25.1406 |
max | 74 |