concat join merge
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들을 조인할 수 있다.
- 구문
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’
- lsuffix, rsuffix
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 조인만 지원한다.
- 구문
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
- on
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() 를 사용한다.
- 컨트롤이 편하다.