Reshaping Data - Change layout, sorting, reindexing, renaming
- 재구조화(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)
: 연산이 가능한 피벗 테이블
df.head()
결과물 )의료기관종별(1) | 2014 | 2014.1 | 2014.2 | 2015 | 2015.1 | 2015.2 | 2016 | 2016.1 | 2016.2 | 2017 | 2017.1 | 2017.2 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 의료기관종별(1) | 입원환자 (건) | 외래환자 (회) | 퇴원환자 (건) | 입원환자 (건) | 외래환자 (회) | 퇴원환자 (건) | 입원환자 (건) | 외래환자 (회) | 퇴원환자 (건) | 입원환자 (건) | 외래환자 (회) | 퇴원환자 (건) |
1 | 전체 | 9105050.0 | 892637667.0 | 9410734.0 | 9289026.0 | 889305558.0 | 9616010.0 | 9668108.0 | 924554212.0 | 9992759.0 | 9490057.0 | 925584924. | 9825940.0 |
2 | 상급종합병원 | 1615801.0 | 34915453.0 | 1642113.0 | 1655144.0 | 35945441.0 | 1683153.0 | 1783450.0 | 38193925.0 | 1810729.0 | 1833377.0 | 39140685.0 | 1861502.0 |
3 | 종합병원 | 2929371.0 | 62107328.0 | 2995106.0 | 2968978.0 | 62302768.0 | 3039013.0 | 3171355.0 | 66437801.0 | 3238960.0 | 3098763.0 | 67228052.0 | 3169089.0 |
4 | 병원 | 2751873.0 | 60630401.0 | 2841399.0 | 2866076.0 | 61411640.0 | 2959724.0 | 2920029.0 | 64220984.0 | 3009903.0 | 2771038.0 | 63776830.0 | 2852455.0 |
id_vars
: 그대로 나둘 Column 명value_vars
: 녹일 Column 명var_name
: 열에 사용할 이름 (행으로 녹일 때, 열로 지정할 이름)value_name
: 열의 값에 사용할 이름 (행으로 녹일 때, 열의 값에 지정할 이름)
- 목표 : Columns 을 구성하고있는 연월 데이터를 행으로 녹이기
df_melt = df.melt(id_vars='의료기관종별(1)', var_name="연도", value_name="환자수") df_melt.head()
의료기관종별(1) 연도 환자수 0 의료기관종별(1) 2014 입원환자 (건) 1 전체 2014 9105050.0 2 상급종합병원 2014 1615801.0 3 종합병원 2014 2929371.0 4 병원 2014 2751873.0
- 결과 : 행에 있으면 좋을 데이터가 열로 구성되어 있을 때, Melt 를 이용해 쉽게 DataFrame의 구조를 변경할 수 있다.
axis
: 행을 기준으로 붙이기 (0 : 기본값), 열을 기준으로 붙이기 (axis=1)ignore_index=True
: 인덱스값 reset 하는 방법
- 목표 : 나누어져있는 두 데이터프레임을 합치기
# 2014년, 2015년 데이터 일부 가져와서 변수에 할당하기 df1 = df_melt[df_melt["연도"] == '2014'][:2] df2 = df_melt[df_melt["연도"] == '2015'][:2]
# 2014년, 2015년 병합 (병합기준 : default=행) df_concat = pd.concat([df1, df2]) df_concat
의료기관종별(1) 연도 환자수 0 의료기관종별(1) 2014 입원환자 (건) 1 전체 2014 9105050.0 48 의료기관종별(1) 2015 입원환자 (건) 49 전체 2015 9289026.0 # 인덱스 값 reset 하여 가져오는 방법 df_concat = pd.concat([df1, df2], ignore_index=True) df_concat
의료기관종별(1) 연도 환자수 0 의료기관종별(1) 2014 입원환자 (건) 1 전체 2014 9105050.0 2 의료기관종별(1) 2015 입원환자 (건) 3 전체 2015 9289026.0 # 열을 기준으로 데이터 병합 df_concat = pd.concat([df1, df2], axis=1) df_concat
의료기관종별(1) 연도 환자수 의료기관종별(1) 연도 환자수 0 의료기관종별(1) 2014 입원환자 (건) NaN NaN NaN 1 전체 2014 9105050.0 NaN NaN NaN 48 NaN NaN NaN 의료기관종별(1) 2015 입원환자 (건) 49 NaN NaN NaN 전체 2015 9289026.0
- 주의사항
ignore_index
는axis=1
와 함께 사용하면 컬럼명을 기준으로 reset 해준다.df_concat = pd.concat([df1, df2], axis=1, ignore_index=True) df_concat
0 1 2 3 4 5 0 의료기관종별(1) 2014 입원환자 (건) NaN NaN NaN 1 전체 2014 9105050.0 NaN NaN NaN 48 NaN NaN NaN 의료기관종별(1) 2015 입원환자 (건) 49 NaN NaN NaN 전체 2015 9289026.0