[회고] 신입 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, 세로 결합의 경우엔 그럴 일은 없다.)
반응형