Pandas Dataframe 합성
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를 결합과 동시에 재배열 할 수 있다.
댓글남기기