본문 바로가기
🛠️Skill/Python

[Python] 데이터 합치기 Join, merge, concat

by Istj_eff 2022. 10. 11.

JOIN 합치기

df.join (붙이는df, how=, lsuffix='', rsuffix='')
  • 가로로 합치기 (원래 데이터 오른쪽으로 새로운 데이터 붙임)
  • 2개 이상의 DF 합치기 가능, 기본방식은 left outer

 

✔️ how (on: 어느 컬럼을 기반으로 merge 할것인지 결정)

left 좌측df(기존df)에 존재하는 인덱스를 기준으로해서 데이터를 합친다
right 우측(붙이는df)에 존재하는 인덱스만 가져와서 붙이기
outer 한쪽에라도 존재하는 인덱스는 다 가져와서 붙이기 (합집합)
inner 양쪽 df에 공통적으로 존재하는 인덱스만 가져와서 붙이기 (교집합)

 

✔️ 예제

df1 = pd.DataFrame(np.arange(4).reshape(4,1), columns=['df1'])
df2 = pd.DataFrame(np.arange(4).reshape(4,1)*100, index=[1,3,4,5], columns=['df2'])

# left는 좌측df(기존df)에 존재하는 인덱스를 기준으로해서 데이터를 합친다
dleft=df1.join(df2,how='left') # 1,3만 겹치니까 df2에 0,2인덱스는 NaN값으로 나옴
dleft

# right는 우측(붙이는df)에 존재하는 인덱스만 가져와서 붙이기
dright=df1.join(df2,how='right') #마찬가지로 1,3만 겹치니까 df1에 없는 4,5인덱스의 values는 NaN값으로 나옴
dright

# inner는 양쪽 df에 존재하는 인덱스만 가져와서 붙이기 (교집합)
dinner=df1.join(df2,how='inner')
dinner

# outer는 한쪽에라도 존재하는 인덱스는 다 가져와서 붙이기 (합집합)
douter=df1.join(df2,how='outer')
douter

 

 

# 중복컬럼이 있으면 join시 중복 방지를 위해 suffix 를 추가
ddf=df1.join(df2,how='outer',lsuffix='1') #lshuffix는 shuffix앞에 left 붙인거임
ddf

ddf=df1.join(df2,how='left',on='사과',lsuffix='1') 
ddf

 

 


MERGE 합치기

df.merge (붙이는df)
  • 2개의 DF만 합칠수있음, 기본적으로 inner join이다

✔️ 예제

# DataFrame 만들기
d={'사과':[1,2,3,4,5],'판매월':['1월','2월','3월','4월','5월'],'판매금액':[1000,1100,1050,950,1000]}
df1=pd.DataFrame(d,index=np.arange(5))

d={'바나나':[10,20,30,40,50],'판매월':['2월','3월','4월','5월','6월'],'금액':[1000,1100,1050,950,1000]}
df2=pd.DataFrame(d,index=[1,2,3,4,5])

 

# 기본 merge는 동일 이름의 커럼이 있으면 해당 컬럼 기반으로 inner join함
# 겹치는 '판매월'중에 겹치는 2,3,4,5월만 출력
fdf=df1.merge(df2) # inner join이랑 출력되는것 같음
fdf

# 기본 merge 다른 방식으로
fdf2 = pd.merge(df1, df2)
fdf2

# left 사과기준으로 join
fdf_left=df1.merge(df2,how='left')
fdf_left

# right 바나나기준으로 join
fdf_right=df1.merge(df2,how='right')
fdf_right

# outer는 합집합
fdf_outer=df1.merge(df2,how='outer')
fdf_outer

 


CONCAT 합치기

  • 기준으로 합치기 (기존데이터 아래로 새로운 데이터를 붙임, 컬럼은 옆으로)
    • 주로 동일 컬럼이 있음을 가정
    • ignore_index : 인덱스를 재지정하는가
    • pd.concat([df1,df2],ignore_index=True)

✔️ 예제

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

pd.concat([df1,df2],ignore_index=False)
# 사과의 0,1,2,3,4인덱스 그대로 가져오고 아래로 바나나의 1,2,3,4,5인덱스 가져와서 붙임

댓글