본문 바로가기

Python/Data analysis

[Python] Data Analysis - DataFrame - merge

단순한 데이터프레임을 합치는 경우에는 concat 도 가능하지만 특정 컬럼값을 기준으로 데이터를 병합하기 위해서는 merge 를 사용해야 한다.

 

 

2개의 데이터프레임을 merge 하는 방법은 아래와 같다.

 

df1
---------------------------------
	업종	종목코드	종목명	  현재가
0	전기전자	005930	삼성전자	  74400
1	화학	051910	LG화학	  896000
2	전기전자	000660	SK하이닉스  101500


df2
---------------------------------
	업종	등락률
0	은행	2.92
1	보험	0.37
2	화학	0.06
3	전기전자	-2.43

 

merge 에서 inner / outer  의 차이는 아래와 같다.

 

pd.merge(left=df1, right=df2, on='업종')
----------------------------------------------
	업종	종목코드	종목명	    현재가		등락률
0	전기전자	005930	삼성전자	  74400		-2.43
1	전기전자	000660	SK하이닉스  101500	-2.43
2	화학	051910	LG화학	  896000	0.06


pd.merge(left=df1, right=df2, how='inner', on='업종')
----------------------------------------------
	업종	종목코드	종목명	  현재가		등락률
0	전기전자	005930	삼성전자	  74400		-2.43
1	전기전자	000660	SK하이닉스  101500	-2.43
2	화학	051910	LG화학	  896000	0.06


pd.merge(left=df1, right=df2, how='outer', on='업종')
----------------------------------------------
	업종	종목코드	종목명		현재가		등락률
0	전기전자	005930	삼성전자		74400.0		-2.43
1	전기전자	000660	SK하이닉스	101500.0	-2.43
2	화학	051910	LG화학		896000.0	0.06
3	은행	NaN	NaN		NaN		2.92
4	보험	NaN	NaN		NaN		0.37

 

how 옵션은 left/right 가 있다.

 

df1
----------------------------------------------------------
	업종	종목코드	종목명	현재가
0	전기전자	005930	삼성전자	74400
1	화학	051910	LG화학	896000
2	서비스업	035720	카카오	121500


df2
----------------------------------------------------------
	업종	등락률
0	은행	2.92
1	보험	0.37
2	화학	0.06
3	전기전자	-2.43

df = pd.merge(left=df1, right=df2, how='left', on='업종')
df
----------------------------------------------------------
	업종	종목코드	종목명	현재가	등락률
0	전기전자	005930	삼성전자	74400	-2.43
1	화학	051910	LG화학	896000	0.06
2	서비스업	035720	카카오	121500	NaN


df = pd.merge(left=df1, right=df2, how='right', on='업종')
df
----------------------------------------------------------
	업종	종목코드	종목명	현재가		등락률
0	은행	NaN	NaN	NaN		2.92
1	보험	NaN	NaN	NaN		0.37
2	화학	051910	LG화학	896000.0	0.06
3	전기전자	005930	삼성전자	74400.0		-2.43

 

2개의 데이터프레임에서 기준 컬럼 이름이 다르면 둘다 입력해야 한다. inner 옵션과 동일한 교집합만 추출된다.

 

df1
----------------------------------------------------------
	업종	종목코드	종목명	현재가
0	전기전자	005930	삼성전자	74400
1	화학	051910	LG화학	896000
2	서비스업	035720	카카오	121500


df2
----------------------------------------------------------
	항목	등락률
0	은행	2.92
1	보험	0.37
2	화학	0.06
3	전기전자	-2.43


df = pd.merge(left=df1, right=df2, left_on='업종', right_on='항목')
df
----------------------------------------------------------
	업종	종목코드	종목명	현재가	항목	등락률
0	전기전자	005930	삼성전자	74400	전기전자	-2.43
1	화학	051910	LG화학	896000	화학	0.06