본문 바로가기
Python

[Python] Pandas dataframe 합치기 (concat, merge, join)

by mine-dong 2021. 11. 29.
#결과
     B   C   D
A             
a1  b1  c1  d1
a2  b2  c2  d2

1. concat

import pandas as pd

df1 = pd.DataFrame({'A':['a1', 'a2', 'a3'],
		'B':['b1', 'b2', 'b3'],
    	'C':['c1', 'c2', 'c3']})
        
df2 = pd.DataFrame({'A':['a4', 'a5', 'a6'],
		'D':['d1', 'd2', 'd3']})

위 데이터 프레임을 사용해 연습해보자

result = pd.concat([df1, df2])
print(result)

# 결과
    A    B    C    D
0  a1   b1   c1  NaN
1  a2   b2   c2  NaN
2  a3   b3   c3  NaN
0  a4  NaN  NaN   d1
1  a5  NaN  NaN   d2
2  a6  NaN  NaN   d3

concat 의 defalut 값은 axis=0이기에 위에서 아래 방향, 즉 행 방향으로 데이터 프레임을 이어 붙이고 해당하지 않는 값은 NaN값으로 채워진다. 

* 여기서 인덱스가 012012 로 약간 보기 싫게 되어있는 것을 볼 수 있는데 이는 ignore_index=True로 해결해 줄 수 있다.

result = pd.concat([df1,df2], ignore_index=True)
result = pd.concat([df1, df2])
print(result)

# 결과
    A   B   C   A   D
0  a1  b1  c1  a4  d1
1  a2  b2  c2  a5  d2
2  a3  b3  c3  a6  d3

또, axis=1 옵션으로 좌에서 우로, 열방향 concat이 가능하다.

 


2. merge

import pandas as pd

df1 = pd.DataFrame({'A':['a1', 'a2', 'a3'],
		'B':['b1', 'b2', 'b3'],
    	'C':['c1', 'c2', 'c3']})
        
df2 = pd.DataFrame({'A':['a1', 'a2', 'a6'],
		'D':['d1', 'd2', 'd3']})
result = pd.merge(df1, df2)
print(result)

# 결과
    A   B   C   D
0  a1  b1  c1  d1
1  a2  b2  c2  d2

merge의 defalt 값은 on=None이여서, 두 데이터 프레임의 공통된 열과 그 열의 값을 기준으로 교집합(inner) 조인이 된다.

 

result = pd.merge(df1, df2, how='outer')
print(result)

# 결과
    A    B    C    D
0  a1   b1   c1   d1
1  a2   b2   c2   d2
2  a3   b3   c3  NaN
3  a6  NaN  NaN   d3

how='outer'옵션을 주어 두 데이터셋의 공통된 열에서 유니크 값을 기준으로 합쳐지며 없는 값은 NaN으로 표기된다.

how='left'로 옵션을 바꿔주면 left join이 되어 왼쪽에 입력한 df1이 기준이 되는 결과가 나온다.

#결과
    A   B   C    D
0  a1  b1  c1   d1
1  a2  b2  c2   d2
2  a3  b3  c3  NaN

 


3. join

join 함수는 merge를 기반으로 만들어 졌기에 기본 작동 방식이 비슷하다. 그 중에서 차이점은 join 함수는 인덱스를 기준으로 결합한다는 것이다.

df1.set_index('A', inplace=True)
df2.set_index('A', inplace=True)

merge 예제와 같은 데이터 셋을 사용하지만 join은 인덱스 기준 결합이기 때문에 위 코드로 df1 과 df2 의 인덱스를 A 컬럼으로 지정해 준다.

result = df1.join(df2)
print(result)

# 결과
     B   C    D
A              
a1  b1  c1   d1
a2  b2  c2   d2
a3  b3  c3  NaN

df1의 인덱스를 기준으로 join 된 결과를 확인할 수 있다.

join 의 defalt는 how='left'이기 때문에, how='inner'옵션을 주면 아래와 같은 결과가 나온다.