[Pandas] 데이터 재구조화(Melt, Concat) - cheat sheet🔥

Jaeyoung·2022년 10월 22일
0
post-thumbnail

목표 설정

  • Pandas Cheat Sheet 에서 데이터 재구조화 중 melt, concat 학습하기
  • 학습 부분
    • Reshaping Data - Change layout, sorting, reindexing, renaming
      • Melt
      • Concat

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) : 연산이 가능한 피벗 테이블

실습에 사용할 데이터

  • Dataset : KOSIS 의료기관종별 환자 수 (2014 ~ 2017)
  • Dataset 미리보기 ( df.head() 결과물 )
의료기관종별(1)20142014.12014.220152015.12015.220162016.12016.220172017.12017.2
0의료기관종별(1)입원환자 (건)외래환자 (회)퇴원환자 (건)입원환자 (건)외래환자 (회)퇴원환자 (건)입원환자 (건)외래환자 (회)퇴원환자 (건)입원환자 (건)외래환자 (회)퇴원환자 (건)
1전체9105050.0892637667.09410734.09289026.0889305558.09616010.09668108.0924554212.09992759.09490057.0925584924.9825940.0
2상급종합병원1615801.034915453.01642113.01655144.035945441.01683153.01783450.038193925.01810729.01833377.039140685.01861502.0
3종합병원2929371.062107328.02995106.02968978.062302768.03039013.03171355.066437801.03238960.03098763.067228052.03169089.0
4병원2751873.060630401.02841399.02866076.061411640.02959724.02920029.064220984.03009903.02771038.063776830.02852455.0

Melt

  • id_vars : 그대로 나둘 Column 명
  • value_vars : 녹일 Column 명
  • var_name : 열에 사용할 이름 (행으로 녹일 때, 열로 지정할 이름)
  • value_name : 열의 값에 사용할 이름 (행으로 녹일 때, 열의 값에 지정할 이름)

실습으로 배우는 Melt

  • 목표 : Columns 을 구성하고있는 연월 데이터를 행으로 녹이기
df_melt = df.melt(id_vars='의료기관종별(1)', var_name="연도", value_name="환자수")
df_melt.head()
의료기관종별(1)연도환자수
0의료기관종별(1)2014입원환자 (건)
1전체20149105050.0
2상급종합병원20141615801.0
3종합병원20142929371.0
4병원20142751873.0
  • 결과 : 행에 있으면 좋을 데이터가 열로 구성되어 있을 때, Melt 를 이용해 쉽게 DataFrame의 구조를 변경할 수 있다.

Concat

  • axis : 행을 기준으로 붙이기 (0 : 기본값), 열을 기준으로 붙이기 (axis=1)
  • ignore_index=True : 인덱스값 reset 하는 방법

실습으로 배우는 Concat

  • 목표 : 나누어져있는 두 데이터프레임을 합치기
# 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전체20149105050.0
48의료기관종별(1)2015입원환자 (건)
49전체20159289026.0
# 인덱스 값 reset 하여 가져오는 방법
df_concat = pd.concat([df1, df2], ignore_index=True)
df_concat 
의료기관종별(1)연도환자수
0의료기관종별(1)2014입원환자 (건)
1전체20149105050.0
2의료기관종별(1)2015입원환자 (건)
3전체20159289026.0
# 열을 기준으로 데이터 병합
df_concat = pd.concat([df1, df2], axis=1)
df_concat 
의료기관종별(1)연도환자수의료기관종별(1)연도환자수
0의료기관종별(1)2014입원환자 (건)NaNNaNNaN
1전체20149105050.0NaNNaNNaN
48NaNNaNNaN의료기관종별(1)2015입원환자 (건)
49NaNNaNNaN전체20159289026.0
  • 주의사항
    ignore_indexaxis=1와 함께 사용하면 컬럼명을 기준으로 reset 해준다.
df_concat = pd.concat([df1, df2], axis=1, ignore_index=True)
df_concat 
012345
0의료기관종별(1)2014입원환자 (건)NaNNaNNaN
1전체20149105050.0NaNNaNNaN
48NaNNaNNaN의료기관종별(1)2015입원환자 (건)
49NaNNaNNaN전체20159289026.0

참고문헌

profile
데이터 분린이:)

0개의 댓글