4 분 소요

dataframe 합성


pandas 는 두 개 이상의 데이터프레임을 하나로 합치는 데이터 병합이나 연결을 지원한다.


merge 함수


mertge 함수는 두 데이터 프레임의 공통으로 존재하는 열이나 인덱스를 기준으로 두 개의 테이블을 합친다. 이 때 기준이 되는 데이터를 key 라고 한다.


데이터셋을 만들고 기능을 살펴보자.


데이터 생성


import pandas as pd
import numpy as np

list1 = ['A','B','C','D','E']
list2 = [4,5,3,6,9]
list3 = [0.66,0.77,0.88,0.99,1.11]
list4 = ['홍길동','윤길동','이길동','박길동','김길동']

df = pd.DataFrame({'코드':list1, 'int':list2,'float': list3 ,'이름':list4})


df


코드 int float 이름
0 A 4 0.66 홍길동
1 B 5 0.77 윤길동
2 C 3 0.88 이길동
3 D 6 0.99 박길동
4 E 9 1.11 김길동
list5 = ['홍길동','윤길동','이길동','박길동','강길동','차길동']
list6 = [950303,941215,970205,930905,960413,970321]

df2 = pd.DataFrame({'이름': list5, '생년월일': list6})

df2
이름 생년월일
0 홍길동 950303
1 윤길동 941215
2 이길동 970205
3 박길동 930905
4 강길동 960413
5 차길동 970321

inner join 방식


merge 함수는 SQL 에서 join 과 흡사한 기능을 수행하며, 기본 값은 inner join이다.
SQL 의 JOIN 과 마찬가지로 두 데이터 간의 공통적으로 존재하는 값이 필요하다.

위의 데이터프레임에서 공통으로 존재하는 이름 칼럼을 이용하여 merge 함수를 사용해보자.


pd.merge(df,df2)
코드 int float 이름 생년월일
0 A 4 0.66 홍길동 950303
1 B 5 0.77 윤길동 941215
2 C 3 0.88 이길동 970205
3 D 6 0.99 박길동 930905

pd.merge()의 인자값으로 공통의 칼럼이 존재하는 데이퍼 프레임 2개를 주면 SQL 의 inner join 과 마찬가지로 key가 존재하는 부분만 연결된다.

outer join 방식

outer join 방식은 한쪽에만 있는 key 값까지 모두 보여준다.

pd.merge(df,df2, how='outer')
코드 int float 이름 생년월일
0 A 4.0 0.66 홍길동 950303.0
1 B 5.0 0.77 윤길동 941215.0
2 C 3.0 0.88 이길동 970205.0
3 D 6.0 0.99 박길동 930905.0
4 E 9.0 1.11 김길동 NaN
5 NaN NaN NaN 강길동 960413.0
6 NaN NaN NaN 차길동 970321.0

SQL의 full outer join과 같은 결과를 얻을 수 있다.

left, rigth join

기준이 되는 데이터의 모든 값에 키값이 존재하는 데이터만을 연결한다.

pd.merge(df,df2, how='left')
코드 int float 이름 생년월일
0 A 4 0.66 홍길동 950303.0
1 B 5 0.77 윤길동 941215.0
2 C 3 0.88 이길동 970205.0
3 D 6 0.99 박길동 930905.0
4 E 9 1.11 김길동 NaN
pd.merge(df,df2, how='right')
코드 int float 이름 생년월일
0 A 4.0 0.66 홍길동 950303
1 B 5.0 0.77 윤길동 941215
2 C 3.0 0.88 이길동 970205
3 D 6.0 0.99 박길동 930905
4 NaN NaN NaN 강길동 960413
5 NaN NaN NaN 차길동 970321

칼럼 명이 같으나 기준 열이 아닌 경우


칼러명이 같으나 키가 되면 안되는 칼럼이 존재한다면 ON 인수로 기준을 명시한다.

df['추가정보'] = [300,400,500,600,700]
df2['추가정보'] = ['27살','28살','25살','29살','26살','25살']
# pd.merge(df,df2) 오류 발생

pd.merge(df,df2, on='이름')
코드 int float 이름 추가정보_x 생년월일 추가정보_y
0 A 4 0.66 홍길동 300 950303 27살
1 B 5 0.77 윤길동 400 941215 28살
2 C 3 0.88 이길동 500 970205 25살
3 D 6 0.99 박길동 600 930905 29살

on 으로 기준키를 지정해주지 않는다면 오류가 발생한다.
이름이 같은 칼럼은 구분을 위해 뒤에 _x,_y 가 추가 된다.

기준 열이나 칼럼명이 다를 경우

기준 열이나 칼럼명이 다를 경우엔 칼럼명을 변경하거나 left_on , right_on 인수를 작성해주면 된다.

df = df.rename(columns={'이름':'name'})
pd.merge(df,df2, left_on='name', right_on='이름')
코드 int float name 추가정보_x 이름 생년월일 추가정보_y
0 A 4 0.66 홍길동 300 홍길동 950303 27살
1 B 5 0.77 윤길동 400 윤길동 941215 28살
2 C 3 0.88 이길동 500 이길동 970205 25살
3 D 6 0.99 박길동 600 박길동 930905 29살

join 함수


merge 함수가 아닌 join 함수로 비슷한 기능을 수행할 수 있다.


차이점은 join 함수의 경우 left join 을 default로 가지고 있으며 인덱스를 키 값으로 두 데이터 프레임을 결합한다.

# 데이터 초기화함

df.set_index('이름',inplace=True)
df2.set_index('이름', inplace=True)

inplace=True 를 통해 새로운 데이터 프레임에 입력하는 것이 아닌 해당 데이터 프레임을 바로 변환하는 방법을 이용할 수 있다.

df.join(df2)
코드 int float 생년월일
이름
홍길동 A 4 0.66 950303.0
윤길동 B 5 0.77 941215.0
이길동 C 3 0.88 970205.0
박길동 D 6 0.99 930905.0
김길동 E 9 1.11 NaN

concat 함수

concat 함수 기준 열을 사용하지 않고 물리적으로 데이터프레임을 이어 붙이는 기능을 한다.


우선 데이터 셋을 만들고 실습해보자.

df3 = pd.DataFrame([['a1','a2','a3'],
                   ['b1','b2','b3'],
                   ['c1','c2','c3']],
                   columns=['A','B','C'],
                   index = [1,2,3])

df4 = pd.DataFrame([['a1','a2','a3'],
                   ['b1','b2','b3'],
                   ['d1','d2','d3']],
                   columns=['A','B','D'],
                   index = [2,3,4])

concat 은 default 값으로 axis=0 이 설정되어 있음으로 함수 사용시 x축을 기준으로 데이터가 결합된다.

result1 = pd.concat([df3,df4])
result1
A B C D
1 a1 a2 a3 NaN
2 b1 b2 b3 NaN
3 c1 c2 c3 NaN
2 a1 a2 NaN a3
3 b1 b2 NaN b3
4 d1 d2 NaN d3

outer가 default 이기 때문에 비어있는 데이터에선 NaN 을 출력한다.

result2 = pd.concat([df3,df4], axis=1)
result2
A B C A B D
1 a1 a2 a3 NaN NaN NaN
2 b1 b2 b3 a1 a2 a3
3 c1 c2 c3 b1 b2 b3
4 NaN NaN NaN d1 d2 d3

axis를 1로 설정함으로서 y축을 기준으로 데이터를 결합할 수 있다.

result3 = pd.concat([df3,df4], axis=1,join='inner')
result3
A B C A B D
2 b1 b2 b3 a1 a2 a3
3 c1 c2 c3 b1 b2 b3

join=’inner’ 를 설정함으로서 교집합맞 추출하는 inner방식의 결합이 가능하다.

result4 = pd.concat([df3,df4],ignore_index=True)
result4
A B C D
0 a1 a2 a3 NaN
1 b1 b2 b3 NaN
2 c1 c2 c3 NaN
3 a1 a2 NaN a3
4 b1 b2 NaN b3
5 d1 d2 NaN d3

ignore_index=True 을 이용해서 axis=0으로 결합시 중복되는 index를 결합과 동시에 재배열 할 수 있다.

댓글남기기