이전 글에서 이어지는 글입니다.

 

(JY) 파이썬 Pandas groupby 이해하고 활용하기 -3

이전 글에서 이어지는 글입니다. (JY) 파이썬 Pandas groupby 이해하고 활용하기 -2 이전 글에서 이어지는 글입니다. (JY) 파이썬 Pandas groupby 이해하고 활용하기 -1 import pandas as pd train_data = pd.read..

dsbook.tistory.com

데이터 프레임을 직접 만들어보자.

df1 = pd.DataFrame('key1' : np.arange(10), 'value1' : np.random.randn(10))
df2 = pd.DataFrame('key1' : np.arange(10), 'value1' : np.random.randn(10))
df3 = pd.DataFrame('key2' : np.arange(10), 'value2' : np.random.randn(10))

3. 데이터 병합하기

1) 데이터 이어붙이기: concat()

  pd.concat( objs, axis, ignore_index ..... )
objs 순서가 있는 집합이나 Series 혹은 DataFrame으로 만들어진 객체
axis objs에 들어가있는 객체들을 합칠 방향 (axis = 0 : row방향, axis = 1 : column방향) 
ignore_index 각 객체들을 합칠때, 그 객체들의 index 값이 살아있는 채로 이어붙여지게 된다. 만약 이 값을 True로 지정해주면, 기존의 index값을 무시하고 zero-based index가 붙여지게 된다.

 

objs에 지정한 객체 순서대로 데이터들을 병합한다. 만약 이 데이터들의 column이 동일한 경우, 새로운 column을 만들지 않는다. concat함수는 default로 row기반으로 연결되기 때문에, 기존에 만들어졌던 column바로 밑에 이어 붙이게 된다.

pd.concat([df1, df2])

column이 다를 경우에는 새로운 column을 만든다. concat함수를 사용하여 데이터를 병합할 때는, default로 row기반으로 연결되기 때문에, 새로운 column이 만들어져도 이전 객체 바로 옆에 붙지 않는다. 이전 객체의 index에는 모두 NaN 값이 들어가고, 그 바로 밑에 이어서 붙여지게 된다.

pd.concat([df1, df3])

이렇게 서로 다른 column을 합칠 경우, NaN값이 많이 나와 DataFrame이 지저분해 보인다. 이럴 경우, 객체들을 병합시킬 때, row기반이아닌 column기반으로 병합시키면 된다. axis 속성에는 default로 0(row기반)이 들어가 있다. 이 속성을 1(column)으로 지정해주면 된다.

pd.concat([df1, df3], axis = 1)

만약 column 이름이 같아 데이터가 이미 row기반으로 연결되어 NaN값이 없어 지저분해보이진 않지만, index값이 zero based 부터 1씩 증가하는 형태가 아니라 각 객체의 index를 그대로 담고있어 불편하다면, ignore_index 속성을 이용하여 index를 초기화하면 된다. ignore_index 속성을 True로 지정해주면, 병합시킨 객체의 index를 zero-based index로 만든다.

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

 

 


2) 데이터 병합하기: merge()

merge()는 두 개의 dataframe의 공통 열(column) 혹은 인덱스(index)를 기준으로 두 개의 테이블을 병합하는 함수이며, 이 때 기준이 되는 column혹은 index의 데이터를 키(key)라고 한다.

  pd.merge( left, right, how, on, left_on, right_on, left_index, right_index, sort .... )
left, right left : dataframe
right : left와 합칠 dataframe 혹은 series
how

합치는 유형을 선택한다. (default값은 'inner'이다.)
 - left : 왼쪽 frame의 key만 사용한다.
 - right : 오른쪽 frame의 key만 사용한다.
 - outer : key 값이 한 쪽에만 있어도 데이터를 보여준다.
 - inner : 양쪽 frame의 교집합으로 이루어진 key를 사용한다.
만약, table에 key값이 같은 데이터가 여러개가 있는 경우, 있을 수 있는 모든 경우의 수를 따져 조합을 만들어 낸다.

on 기준이 되는 column이나 index이름을 지정한다. 이때, 이 column과 index는 양쪽 dataframe에서 모두 발견되어야 한다.
 - left_on : 왼쪽 dataframe에 기준이 되는 column이나 index 이름을 지정한다.
 - right_on : 오른쪽 dataframe에 기준이 되는 column이나 index 이름을 지정한다.
index  - left_index : 왼쪽 dataframe의 index를 기준열로 사용한다.
 - right_index : 오른쪽 dataframe의 index를 기준열로 사용한다.

 

customer = pd.DataFrame({ 
                               'customer_id' : np.arange(6),
                               'name' : ['철수'"", '영희', '길동', '영수', '수민', '동건'],
                               '나이' : [40, 20, 21, 30, 31, 18]})
orders = pd.DataFrame({
                              'customer_id' : [1, 1, 2, 2, 2, 3, 3, 1, 4, 9],
                              'item' : ['치약', '칫솔', '이어폰', '헤드셋', '수건', '생수', '수건', '치약', '생수', '케이스'],                                      'quantity' : [1, 2, 1, 1, 3, 2, 2, 3, 2, 1]})

customer
orders

 

how는 기본적으로 inner이 default값이기 때문에 아무 조건없이 두 dataframe을 병합하면 customer와 orders의 column이 동일한 customer_id를 key값으로 삼는다. 아래 예제에서 on으로 기준이 되는 column 명을 customer_id로 지정해도 아래와 같은 결과가 나온다. (양쪽 dataframe에서 기준이 되어야 하는 column값이 서로 다르다면, 각각 left_on, right_on을 사용한다.)

pd.merge(customer, orders)
pd.merge(customer, orders, on = 'customer_id')

기준이 되는 column을 customer_id로 지정하고 how 속성을 left로 지정하면, left dataframe, 즉 첫번째로 지정된 데이터프레임의 customer_id를 key값으로 가져오며, 이를 기준으로 right dataframe을 병합하게 된다. 

pd.merge(customer, orders, on = 'custom er_id', how = 'left')

how의 속성을 right로 지정하면, 두번째로 지정된 데이터프레임의 customer_id를 key값으로 가져오게되며, 이를 기준으로 left dataframe을 병합한다. 

pd.merge(customer, orders, on = 'customer_id', how = 'right')

how의 속성을 outer로 지정하면, 양쪽 데이터프레임의 customer_id를 key값으로 가져오게되며, 이를 기준으로 left dataframe과 right dataframe을 병합한다.

pd.merge(customer, orders, on = 'customer_id', how = 'outer')

 

728x90
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 라이프코리아트위터 공유하기
  • shared
  • 카카오스토리 공유하기