concat join merge

Published by onesixx on

velog.io/@mingki/판다스-데이터-프레임-합치기

1. concat


1.1 concat()


  • 기본 개념
    • 수직, 그리고 조인을 이용한 수평 결합 두 가지 모두 지원한다.
    • 수평 결합의 경우, full outer join과 inner join을 둘 다 지원한다.
      • full outer join이 기본값.
      • 조인 기준 : index가 같은 행끼리 합친다.(equi=join)
  • 구문
    • pd.concat(objs, [, key=리스트], axis=0, join='outer')
  • 매개변수
    • objs : 합칠 DataFrame을 리스트로 전달.
    • keys=[]를 이용해 합친 행들을 구분하기 위한 다중 인덱스 처리.
    • axis
      • 0 또는 index : 수직 결합
      • 1 또는 columns : 수평 결합
    • join : 조인방식
      • ‘outer'(기본값)
      • ‘inner’
  • 조인(join)
  • 여러 데이터프레임에 흩어져 있는 정보 중 필요한 정보만 모아서 결합하기 위한 것.
  • 두개 이상의 데이터프레임을 특정 컬럼(열)의 값이 같은 행 끼리 수평 결합하는 것.
  • Inner Join, Left Outer Join, Right Outer Join, Full Outer Join

1.2 예제


# 합쳐보기
pd.concat([s_2016, s_2017, s_2018]) # 수직으로 쭉 붙여준다.
# axis의 기본값은 0이다. index

# 인덱스를 처리하는 방법 두 가지.
# 1. 원본의 index를 무시하는 방법.
pd.concat([s_2016, s_2017, s_2018], ignore_index=True)
# 2. keys를 이용해서 멀티 index로 index를 만든다.
df = pd.concat([s_2016, s_2017, s_2018], keys=['2016', '2017', '2018'])
df

df.loc['2016', 0]
df.loc['2016']

# concat을 이용한 join (수평 결합)
pd.concat([s_2017, s_info], axis=1) # 기본값이 풀아우터 조인.
# 기준은 인덱스가 같은 애들끼리 붙인 거야.

# 그래서 붙이기 전에 인덱스를 맞춰줘야 한다.
pd.concat([s_2017.set_index('Symbol'), s_info.set_index('Symbol')], axis=1)
# 심볼이 같은 것끼리 조인(풀아우터 조인)

# 조인을 이너로
# 그래서 붙이기 전에 인덱스를 맞춰줘야 한다.
pd.concat([s_2017.set_index('Symbol'), s_info.set_index('Symbol')], axis=1, join='inner')

# info를 먼저 나오게 하기
pd.concat([s_info.set_index('Symbol'), s_2017.set_index('Symbol')], axis=1, join='inner')
# 순서를 바꿔주면 됩니다.

df = pd.concat([s_2016, s_2017, s_2018], ignore_index=True)
df = df.set_index('Symbol')
# df = pd.concat([s_info.set_index('Symbol'),df], axis=1)
# df2 = pd.concat([s_info.set_index('Symbol'),df], axis=1)

# 한 쪽 DataFrame에 동일한 index 이름이 있는 경우, concat으로 join할 수 없다.
# join은 가능.
df2 = df.join(s_info.set_index('Symbol'))
df2

2. join


2.1 join()


  • 기본 개념
    • 두 개 이상의 DataFrame들을 조인할 수 있다.
      • 조인 기준 : index가 같은 값인 행들끼리 합친다.(equi-join)
      • 조인 기본 방식 : Left Outer Join
  • 구문
    • DataFrame 객체.join(oters, how='left', lsuffix='', rsuffix='')
    • df_A.join(df_b)
    • df_A.join([df_b, df_c, df_d])
  • 매개변수
    • lsuffix, rsuffix
      • 조인 대상 Dataframe에 같은 이름의 컬럼이 있으면 에러 발생.
      • 같은 이름이 있는 경우, 붙일 접미어를 지정해준다.
    • how : 조인 방식.
      • ‘left’ : 기본값
      • ‘right’
      • ‘outer’
      • ‘inner’

2.2 예제


# concat은 동일한 컬럼이 있어도 상관없다
# 얘는 에러난다. 동일한 컬럼이 하나라도 있으면 에러가 발생한다.
# 그래서 lsuffix, rsuffix가 있다.
# ex lsuffix='_a', rsuffix='_b'
# share_a, share_b

# s_info.join(s_2017) # 에러 발생.
# 같은 컬럼이 있어서 에러가 발생한다.

s_info.join(s_2017, lsuffix='_info', rsuffix='_2017') # 이렇게 lsuffix, rsuffix 이용

s_info2 = s_info.set_index('Symbol')
s_2017_2 = s_2017.set_index('Symbol')

s_info2.join(s_2017_2) # 디폴트가 레프트 조인이다.

# 이너 조인으로 조인하기
s_info2.join(s_2017_2, how='inner') # how로 조인 방식 변경 가능

# 세 개 이상 조인하기
# s_2016.join([s_2017, s_2018]) # 에러 발생
# 같은 컬럼이 있어서 에러가 발생한다.

s_2016_2 = s_2016.copy()
s_2017_2 = s_2017.copy()
s_2018_2 = s_2018.copy()

# 컬럼 이름에 이름 붙여주기
s_2016_2 = s_2016_2.add_suffix('_2016')
s_2017_2 = s_2017_2.add_suffix('_2017')
s_2018_2 = s_2018_2.add_suffix('_2018')

# s_2016.join([s_2017, s_2018], lsuffix='_2016', rsuffix='_2017') # 에러 발생
# 세 개 이상이라서 에러가 발생한다.
# 세 개 이상일 때 동일한 이름이 있으면 lsuffix, rsuffix를 사용할 수 없다.

s_2016_2.join([s_2017_2, s_2018_2]) # 컬럼 이름이 다르기 때문에 에러가 발생하지 않는다.

3. merge


3.1 merge()


  • 기본 개념
    • 두 개의 DataFrame 조인만 지원한다.
      • 조인 기준 : 같은 컬럼명을 기준으로 equi-join
      • 조인 기본 방식 : inner join
  • 구문
    • DataFrame.merge(합칠 dataframe, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False)
    • df_a.merge(df_b)
  • 매개변수
    • on
      • 같은 컬럼명이 여러 개일 때, join 대상 컬럼을 선택
      • 여러 개 중 골라서 할 수 있다.
    • left_on, right_on
      • 조인할 때 사용할 왼쪽, 오른쪽 DataFrame의 컬럼 이름
    • left_index, right_index
      • 조인할 때 index를 사용할 경우, True로 지정
    • how : 조인 방식
      • ‘left’
      • ‘right’
      • ‘outer’
      • ‘inner’ : 기본값
    • suffixes
      • 두 dataframe에 같은 이름의 컬럼 이름이 있을 경우, 구분을 위해서 붙인 접미어를 리스트로 설정.
      • 생략할 시, x와 y를 붙인다. ex _x, _y

3.2 에제


# 같은 이름이 여러 개일 때 하나만 지정해서 쓰고싶을 때 on
# 오른쪽 컬럼 왼쪽 컬럼 고르는 거
# 왼쪽 인덱스 오른쪽 인덱스 트루 폴스 지정.

# 머지 사용
s_info.merge(s_2016) # 알아서 심볼이 같은 애들끼리 합쳐준다.
# 기본값이 이너조인이다.

# 나는 레프트 아우터 조인할거라면?
s_info.merge(s_2016, how='left')

# 공통된 컬럼이 없다면 에러가 발생한다.
# left_on, right_on
s_info.merge(s_2016_2, left_on='Symbol', right_on='Symbol_2016')
# 사용해서 이름이 다르더라도 공통된 컬럼을 지정해 준다.

s_2016_3 = s_2016.set_index('Symbol')
s_2016_3

# 인덱스를 이용해서 머지하기
s_info.merge(s_2016_3, left_on='Symbol', right_index=True) # 오른쪽 인덱스를 사용해~

# 조인은 맘대로 지정할 수가 없다. 
# 인덱스로 빼서 사용해야 한다.

s_2017.merge(s_2016) # 기본값 이너조인
# 컬럼 4개가 전부 다 같음.

# on을 이용하기
s_2017.merge(s_2016, on='Symbol')

# suffixes 붙여주기
s_2017.merge(s_2016, on='Symbol', suffixes=['_2017', '_2016'])

4. 결론


  • 수직으로 합치는 경우(Union) concat() 을 사용한다.
  • 두 개 이상의 dataframe을 조인할 때는 join() 을 사용한다.
  • 두 개의 dataframe을 조인할 때는 merge() 를 사용한다.
    • 컨트롤이 편하다.
Categories: pandas

onesixx

Blog Owner

Subscribe
Notify of
guest

0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x