[회고] 신입 iOS 개발자가 되기까지 feat. 카카오 자세히보기

🛠 기타/Data & AI

[파이썬] Pandas 기초 - DataFrame 결합

inu 2020. 7. 9. 22:39

import pandas as pd import numpy as np import os os.chdir(r"..\data") df = pd.read_csv('data_studentlist_en.csv', header='infer',encoding = 'latin1')
​​​​​​​​​​​​​​​​NAME GENDER AGE GRADE ABSENCE BLOODTYPE HEIGHT WEIGHT 0 Jared Diamond M 23 3 Y O 165.3 68.2 1 Sarah O'Donnel F 22 2 N AB 170.1 53.0 2 Brian Martin M 24 4 N B 175.0 80.1 3 David Hassel M 23 3 N AB 182.1 85.7 4 Clara Rodriquez F 20 1 Y A 168.0 49.5 5 Jennifer Lorentz F 21 2 N O 162.0 52.0 6 Susan Clark F 22 1 N O 155.2 45.3 7 Margareth Jones F 23 1 N A 176.9 55.0 8 John Bertsch M 23 3 N B 178.5 64.2 9 Jake Timmerman M 22 2 N B 176.1 61.3 10 Joshua Connor M 24 4 Y O 167.1 62.0 11 John Matsuda M 22 2 N AB 180.0 75.8 12 Eddy Johnson M 21 1 N A 162.2 55.3 13 Rebecah Anderson F 23 3 N O 176.1 53.1 14 Linda Carter F 22 2 N B 158.2 45.2 15 Richard Swayze M 24 4 Y B 168.6 70.2 16 Andrew Daley M 21 1 N A 169.2 62.2
  • 위 데이터 프레임 df를 기준으로 설명함.

데이터 프레임 나누기 (슬라이싱)

df_left_small = df_left.loc[:10,] print(df_left_small)
==결과== ​​​​​​​​​​​​​​​​NAME AGE GENDER GRADE ABSENCE 0 Jared Diamond 23 M 3 Y 1 Sarah O'Donnel 22 F 2 N 2 Brian Martin 24 M 4 N 3 David Hassel 23 M 3 N 4 Clara Rodriquez 20 F 1 Y 5 Jennifer Lorentz 21 F 2 N 6 Susan Clark 22 F 1 N 7 Margareth Jones 23 F 1 N 8 John Bertsch 23 M 3 N 9 Jake Timmerman 22 M 2 N 10 Joshua Connor 24 M 4 Y
df_right_small = df_right.loc[7:,] print(df_right_small)
==결과== ​​​​​​​​​​​​​​​​NAME BLOODTYPE WEIGHT HEIGHT 7 Margareth Jones A 55.0 176.9 8 John Bertsch B 64.2 178.5 9 Jake Timmerman B 61.3 176.1 10 Joshua Connor O 62.0 167.1 11 John Matsuda AB 75.8 180.0 12 Eddy Johnson A 55.3 162.2 13 Rebecah Anderson O 53.1 176.1 14 Linda Carter B 45.2 158.2 15 Richard Swayze B 70.2 168.6 16 Andrew Daley A 62.2 169.2
  • df를 나눈 df_left_small과 df_right_small로 결합을 진행해보자.

데이터프레임 결합 : Inner Join

merge_df = pd.merge(df_left_small,df_right_small,left_on='NAME', right_on = 'NAME', how='inner') print(merge_df)
==결과== ​​​​​​​​​​​​​​NAME AGE GENDER GRADE ABSENCE BLOODTYPE WEIGHT HEIGHT 0 Margareth Jones 23 F 1 N A 55.0 176.9 1 John Bertsch 23 M 3 N B 64.2 178.5 2 Jake Timmerman 22 M 2 N B 61.3 176.1 3 Joshua Connor 24 M 4 Y O 62.0 167.1
  • how값을 조절해 inner, left, right, outer 중 하나를 결정할 수 있다.
  • inner는 두 데이터 프레임에서 on값(left_on='NAME', right_on = 'NAME')이 일치하는 행만 결합된다.

데이터프레임 결합 : Left Join

merge_df = pd.merge(df_left_small,df_right_small,left_on='NAME', right_on = 'NAME', how='left') print(merge_df)
==결과== ​​​​​​​​​​​​​​​​NAME AGE GENDER GRADE ABSENCE BLOODTYPE WEIGHT HEIGHT 0 Jared Diamond 23 M 3 Y NaN NaN NaN 1 Sarah O'Donnel 22 F 2 N NaN NaN NaN 2 Brian Martin 24 M 4 N NaN NaN NaN 3 David Hassel 23 M 3 N NaN NaN NaN 4 Clara Rodriquez 20 F 1 Y NaN NaN NaN 5 Jennifer Lorentz 21 F 2 N NaN NaN NaN 6 Susan Clark 22 F 1 N NaN NaN NaN 7 Margareth Jones 23 F 1 N A 55.0 176.9 8 John Bertsch 23 M 3 N B 64.2 178.5 9 Jake Timmerman 22 M 2 N B 61.3 176.1 10 Joshua Connor 24 M 4 Y O 62.0 167.1
  • left join은 왼쪽 데이터프레임은 일단 모두 결합시키고, 오른쪽 데이터 프레임에 존재하지 않아 알 수없는 값은 NaN으로 처리한다.

데이터프레임 결합 : Right Join

merge_df = pd.merge(df_left_small,df_right_small,left_on='NAME', right_on = 'NAME', how='right') print(merge_df)
==결과== ​​​​​​​​​​​​​​​NAME AGE GENDER GRADE ABSENCE BLOODTYPE WEIGHT HEIGHT 0 Margareth Jones 23.0 F 1.0 N A 55.0 176.9 1 John Bertsch 23.0 M 3.0 N B 64.2 178.5 2 Jake Timmerman 22.0 M 2.0 N B 61.3 176.1 3 Joshua Connor 24.0 M 4.0 Y O 62.0 167.1 4 John Matsuda NaN NaN NaN NaN AB 75.8 180.0 5 Eddy Johnson NaN NaN NaN NaN A 55.3 162.2 6 Rebecah Anderson NaN NaN NaN NaN O 53.1 176.1 7 Linda Carter NaN NaN NaN NaN B 45.2 158.2 8 Richard Swayze NaN NaN NaN NaN B 70.2 168.6 9 Andrew Daley NaN NaN NaN NaN A 62.2 169.2
  • right join은 오른쪽 데이터프레임은 일단 모두 결합시키고, 오른쪽 데이터 프레임에 존재하지 않아 알 수없는 값은 NaN으로 처리한다.

데이터프레임 결합 : Outer Join

merge_df = pd.merge(df_left_small,df_right_small,left_on='NAME', right_on = 'NAME', how='outer') print(merge_df)
==결과== ​​​​​​​​​​​​​​​​NAME AGE GENDER GRADE ABSENCE BLOODTYPE WEIGHT HEIGHT 0 Jared Diamond 23.0 M 3.0 Y NaN NaN NaN 1 Sarah O'Donnel 22.0 F 2.0 N NaN NaN NaN 2 Brian Martin 24.0 M 4.0 N NaN NaN NaN 3 David Hassel 23.0 M 3.0 N NaN NaN NaN 4 Clara Rodriquez 20.0 F 1.0 Y NaN NaN NaN 5 Jennifer Lorentz 21.0 F 2.0 N NaN NaN NaN 6 Susan Clark 22.0 F 1.0 N NaN NaN NaN 7 Margareth Jones 23.0 F 1.0 N A 55.0 176.9 8 John Bertsch 23.0 M 3.0 N B 64.2 178.5 9 Jake Timmerman 22.0 M 2.0 N B 61.3 176.1 10 Joshua Connor 24.0 M 4.0 Y O 62.0 167.1 11 John Matsuda NaN NaN NaN NaN AB 75.8 180.0 12 Eddy Johnson NaN NaN NaN NaN A 55.3 162.2 13 Rebecah Anderson NaN NaN NaN NaN O 53.1 176.1 14 Linda Carter NaN NaN NaN NaN B 45.2 158.2 15 Richard Swayze NaN NaN NaN NaN B 70.2 168.6 16 Andrew Daley NaN NaN NaN NaN A 62.2 169.2
  • outer join은 왼쪽 데이터프레임과 오른쪽 데이터프레임 모두를 우선 결합시키고, 서로 존재하지 않아 알 수 없는 값은 NaN으로 처리한다.

데이터프레임 단순 결합 : concat

  • 위의 merge는 on에 겹치는 col(index)가 존재해야 한다.
  • concat은 강제로 결합이 가능하다.
concat_df = pd.concat([df_left_small,df_right_small], axis=0, sort=True,ignore_index=True) print(concat_df)
==결과== ​​​ABSENCE AGE BLOODTYPE GENDER GRADE HEIGHT NAME WEIGHT 0 Y 23.0 NaN M 3.0 NaN Jared Diamond NaN 1 N 22.0 NaN F 2.0 NaN Sarah O'Donnel NaN 2 N 24.0 NaN M 4.0 NaN Brian Martin NaN 3 N 23.0 NaN M 3.0 NaN David Hassel NaN 4 Y 20.0 NaN F 1.0 NaN Clara Rodriquez NaN 5 N 21.0 NaN F 2.0 NaN Jennifer Lorentz NaN 6 N 22.0 NaN F 1.0 NaN Susan Clark NaN 7 N 23.0 NaN F 1.0 NaN Margareth Jones NaN 8 N 23.0 NaN M 3.0 NaN John Bertsch NaN 9 N 22.0 NaN M 2.0 NaN Jake Timmerman NaN 10 Y 24.0 NaN M 4.0 NaN Joshua Connor NaN 11 NaN NaN A NaN NaN 176.9 Margareth Jones 55.0 12 NaN NaN B NaN NaN 178.5 John Bertsch 64.2 13 NaN NaN B NaN NaN 176.1 Jake Timmerman 61.3 14 NaN NaN O NaN NaN 167.1 Joshua Connor 62.0 15 NaN NaN AB NaN NaN 180.0 John Matsuda 75.8 16 NaN NaN A NaN NaN 162.2 Eddy Johnson 55.3 17 NaN NaN O NaN NaN 176.1 Rebecah Anderson 53.1 18 NaN NaN B NaN NaN 158.2 Linda Carter 45.2 19 NaN NaN B NaN NaN 168.6 Richard Swayze 70.2 20 NaN NaN A NaN NaN 169.2 Andrew Daley 62.2
  • axis가 0이면 세로로 데이터 프레임이 결합된다.
  • sort는 col을 이름순서대로 sorting해준다.
  • ignore_index 값을 True로 두면, 정해진 index값을 무시하고 index를 늘려 순서대로 인덱스를 메긴다.
concat_df = pd.concat([df_left_small,df_right_small], axis=1, sort=True,ignore_index=False) print(concat_df)
==결과== ​​​​​​​​​​​​​​​​NAME AGE GENDER GRADE ABSENCE NAME BLOODTYPE \ 0 Jared Diamond 23.0 M 3.0 Y NaN NaN 1 Sarah O'Donnel 22.0 F 2.0 N NaN NaN 2 Brian Martin 24.0 M 4.0 N NaN NaN 3 David Hassel 23.0 M 3.0 N NaN NaN 4 Clara Rodriquez 20.0 F 1.0 Y NaN NaN 5 Jennifer Lorentz 21.0 F 2.0 N NaN NaN 6 Susan Clark 22.0 F 1.0 N NaN NaN 7 Margareth Jones 23.0 F 1.0 N Margareth Jones A 8 John Bertsch 23.0 M 3.0 N John Bertsch B 9 Jake Timmerman 22.0 M 2.0 N Jake Timmerman B 10 Joshua Connor 24.0 M 4.0 Y Joshua Connor O 11 NaN NaN NaN NaN NaN John Matsuda AB 12 NaN NaN NaN NaN NaN Eddy Johnson A 13 NaN NaN NaN NaN NaN Rebecah Anderson O 14 NaN NaN NaN NaN NaN Linda Carter B 15 NaN NaN NaN NaN NaN Richard Swayze B 16 NaN NaN NaN NaN NaN Andrew Daley A ​​​​WEIGHT HEIGHT 0 NaN NaN 1 NaN NaN 2 NaN NaN 3 NaN NaN 4 NaN NaN 5 NaN NaN 6 NaN NaN 7 55.0 176.9 8 64.2 178.5 9 61.3 176.1 10 62.0 167.1 11 75.8 180.0 12 55.3 162.2 13 53.1 176.1 14 45.2 158.2 15 70.2 168.6 16 62.2 169.2
  • 출력공간이 충분치 않아 아래로 이동해 출력되었지만, 원래 아래의 WEIGHT, HEIGT도 가로로 쭉 이어져있다.
  • axis가 1이면 가로로 데이터 프레임이 결합된다.
  • sort는 col을 이름순서대로 sorting해준다.
  • ignore_index 값을 False로 두면, 정해진 index값을 지키고 결합된다.
  • concat은 강제로 데이터프레임을 결합하는 것이기 때문에 NAME COL이 두개로 보여지게 된다. (aisx = 0, 세로 결합의 경우엔 그럴 일은 없다.)