본문 바로가기

Python/Data analysis

[Python] Data Analysis - DataFrame - join

merge 는 특정 컬럼값을 기준으로 데이터를 병합하고, join 은 인덱스를 기준으로 데이터를 병합한다.

how 옵션에는 left, right, outer, inner 옵션이 있다. how 옵션을 지정하지 않으면 기본 옵션은 left 입니다.

 

 

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


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


df1.join(other=df2)
----------------------------------------------------------
	종목코드	종목명	현재가	등락률
업종				
전기전자	005930	삼성전자	74400	-2.43
화학	051910	LG화학	896000	0.06
서비스업	035720	카카오	121500	NaN

 

아래 샘플에서 연도별 평균을 시가총액을 계산하여 join 해보겠습니다.

df
----------------------------------------------------------
	연도	회사		시가총액
0	2017	삼성		500
1	2017	LG		300
2	2017	SK하이닉스	200
3	2018	삼성		600
4	2018	LG		400
5	2018	SK하이닉스	300


df_mean = df.groupby("연도")["시가총액"].mean().to_frame()
df_mean.columns = ['시가총액평균']
df_mean
----------------------------------------------------------
	시가총액평균
연도	
2017	333.333333
2018	433.333333


df = df.join(df_mean, on='연도')
df
----------------------------------------------------------
	연도	회사		시가총액	시가총액평균
0	2017	삼성		500	333.333333
1	2017	LG		300	333.333333
2	2017	SK하이닉스	200	333.333333
3	2018	삼성		600	433.333333
4	2018	LG		400	433.333333
5	2018	SK하이닉스	300	433.333333

 

이렇듯, 인덱스가 없는 경우에는 특정 컬럼을 기준으로 (on="연도") 2개의 테이블 데이터를 join 할 수 있다.

물론, 인덱스를 df 에 인덱스를 설정하고 join 도 가능하다.

 

시가총액과 시가총액평균을 비교해서 새로운 컬럼을 만들때는 map 을 사용해도 좋지만 dataFrame 에서는 numpy.where 를 사용하는게 조금 더 편리하다.

 

import numpy as np

df['규모'] = np.where(df['시가총액'] >= df['시가총액평균'], "대형주", "중/소형주")
df
----------------------------------------------------------
	연도	회사		시가총액	시가총액평균	규모
0	2017	삼성		500	333.333333	대형주
1	2017	LG		300	333.333333	중/소형주
2	2017	SK하이닉스	200	333.333333	중/소형주
3	2018	삼성		600	433.333333	대형주
4	2018	LG		400	433.333333	중/소형주
5	2018	SK하이닉스	300	433.333333	중/소형주