목표 설정
- Pandas Cheat Sheet 에서 데이터 재구조화 학습하기
- 학습 부분
Reshaping Data - Change layout, sorting, reindexing, renaming
Reshaping
- 재구조화(Reshaping data) 종류
pd.melt(df)
: 열을 모아 행으로 녹이기
pd.concat([df1, df2])
: 여러 데이터프레임 하나로 병합
df.pivot(columns='var', values='val')
: 행을 열로 올리기
pd.pivot_table(df, values='val', index=[], columns=[], aggfunc=func)
: 연산이 가능한 피벗 테이블
- pivot 과 pivot_table 차이
- pivot은 집계함수를 사용할 수 없는 반면, pivot_table 은
aggfunc
을 사용할 수 있음
실습에 사용할 데이터
- Dataset : KOSIS 의료기관종별 환자 수 (2014 ~ 2017)
- Dataset 미리보기 ( 아래 코드의 결과물 )
df = pd.read_excel(file_name)
df_1 = df[df["의료기관종별(1)"]!="의료기관종별(1)"].copy()
df_1 = df_1.melt(id_vars="의료기관종별(1)", var_name="연도", value_name="환자수")
df_1.head()
| 의료기관종별(1) | 연도 | 환자수 |
---|
0 | 전체 | 2014 | 9105050.0 |
1 | 상급종합병원 | 2014 | 1615801.0 |
2 | 종합병원 | 2014 | 2929371.0 |
3 | 병원 | 2014 | 2751873.0 |
4 | 요양병원 | 2014 | 267349.0 |
Pivot
index
: 피봇테이블에서 index 로 설정할 컬럼명
columns
: 피봇테이블에서 colum 으로 설정할 컬럼명
values
: 데이터를 구성하는 값
Pivot_table
values
: 데이터를 구성하는 값
index
: 피봇테이블에서 index 로 설정할 컬럼명
columns
: 피봇테이블에서 colum 으로 설정할 컬럼명
aggfunc
: 연산 기능
fill_value
: 결측치를 채우는 기능
실습으로 배우는 Pivot
- 목표 : 행으로 구성하고있는 의료기관종별 데이터를 열로 올리고, 연도를 인덱스로 넣기
df_2.pivot(index="연도", columns="의료기관종별(1)")["환자수"].head()
df_2.pivot(index="연도", columns="연도기관종별(1)", values="환자수").head()
의료기관종별(1) | 병원 | 보건소 | 보건의료원 | 보건지소 | 보건진료소 | 상급종합병원 | 요양병원 | 의원 | 전체 | 조산원 | 종합병원 | 치과병원 | 치과의원 | 한방병원 | 한의원 |
---|
연도 | | | | | | | | | | | | | | | |
2014 | 2751873.0 | - | 3257.0 | - | - | 1615801.0 | 267349.0 | 1301524.0 | 9105050.0 | - | 2929371.0 | 3499.0 | 2.0 | 202590.0 | 29784.0 |
2014.1 | 60630401.0 | 5934208.0 | 634956.0 | 3949565.0 | 4543564.0 | 34915453.0 | 3018508.0 | 537948803.0 | 892637667.0 | - | 62107328.0 | 3299112.0 | 62456280.0 | 3934930.0 | 109264559.0 |
2014.2 | 2841399.0 | - | 3318.0 | - | - | 1642113.0 | 358071.0 | 1327641.0 | 9410734.0 | - | 2995106.0 | 3534.0 | 2.0 | 209154.0 | 30396.0 |
2015 | 2866076.0 | - | 3126.0 | - | - | 1655144.0 | 278419.0 | 1235564.0 | 9289026.0 | - | 2968978.0 | 3504.0 | 6.0 | 245320.0 | 32889.0 |
2015.1 | 61411640.0 | 5577059.0 | 589570.0 | 3646317.0 | 4419824.0 | 35945441.0 | 2789817.0 | 531295541.0 | 889305558.0 | - | 62302768.0 | 3633522.0 | 65292770.0 | 4149692.0 | 108251597.0 |
- 결과 : pivot 을 사용하면 원하는 컬럼을 index, columns, values 값으로 지정할 수 있다.
- 위 테이블을 보면 연도가 마치 하나의 행으로 자리잡고 있는 것 처럼 보이지만, 출력된 값을 보면 아래와 같다.
- 아래 그림과 같이 pivot 테이블의 구조를 형성한다.
참고문헌