[Python.Pandas] Merge 와 Concat 하여 데이터 붙이기
2020. 12. 29. 05:00ㆍPython과 머신러닝/Pandas 데이터 분석
0. 이전 포스트
1. Merge 함수를 사용하여 데이터 합치기
In [1]:import pandas as pd
In [2]:raw_data = {'subject_id':['1','2','3','4','5','7','8','9','10','11'],
'test_score':[51,15,15,61,16,14,15,1,61,16]}
df_a = pd.DataFrame(raw_data,
columns=['subject_id', 'test_score'])
df_a
Out[2]:
In [3]:raw_data = {'subject_id':['4','5','6','7','8'],
'first_name':['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
'last_name' : ['Bonder', 'Black', 'Balwner', 'Brice', 'Btisan']}
df_b = pd.DataFrame(raw_data,
columns=['subject_id', 'first_name', 'last_name'])
df_b
Out[3]:
In [4]:pd.merge(df_a, df_b, on='subject_id')
Out[4]:
- 데이터 전처리 과정 중에 Merge와 Concat을 자주 사용하게 된다.
- 예를 들어 지난달까지의 주식 정보를 관리하는 데이터 시트가 있고, 이번 달 데이터를 추가하려면 Merge를 통해서 합쳐줘야 할 것이다.
- In[4]와 같이 df_a와 df_b를 합치게 되고, raw_data를 보면 알 수 있다시피 subject_id가 양쪽에 존재하는 경우의 데이터만을 출력하고 있다.
- 이를 DB 용어로는 Inner Join이라고 하고, 따로 지정을 해주지 않고 merge 함수를 호출하면 Inner Join이 된다.
2. Left와 Right의 ID column 명이 다르다면?
In [5]:pd.merge(df_a, df_b,
left_on='subject_id',
right_on='subject_id') # left와 right의 Column 명이 다를 경우, 이 둘을 이어달라고 할 수 있음
Out[5]:
- 현 예제에서는 left DataFrame과 right DataFrame의 Key가 되는 column의 이름이 subject_id로 동일하다.
- 그렇기 때문에 merge(... on='subject_id') 형태로 입력하면 양쪽에서 subject_id를 비교해서 둘 다 존재하는 경우의 데이터만 추출하게 된다.
- 만약 양쪽의 Key가 다른 Column 이름으로 들어가있다면, column이름을 바꿀 수도 있겠지만, In[5]와 같이 left_on/right_on을 각각 지정해주면, 각각의 변수를 읽어와서 서로 비교하는 동작을 한다.
3. Outer Join
In [6]:pd.merge(df_a, df_b,
on='subject_id',
how='outer')
Out[6]:
- merge의 default는 Inner join(교집합)이다.
- 그 외에 left/right/outer join도 할 수 있는데, 이를 지정하기 위해서는 how='outer'과 같이 사용하면 된다.
- outer join은 합집합이기 때문에, 결측치가 있어도 전부 보여지는 것을 Out[6]에서 확인할 수 있다.
4. Concat을 통해 데이터 합치기
In [7]:raw_data = {'subject_id':['1','2','3','4','5'],
'first_name':['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
'last_name':['Anderson', 'Ackerman', 'Ali', 'Aoni', 'Atiches']}
df_a = pd.DataFrame(raw_data, columns = ['subject_id', 'first_name', 'last_name'])
df_a
Out[7]:
In [8]:raw_data = {'subject_id':['4','5','6','7','8'],
'first_name':['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
'last_name':['Bonder', 'Black', 'Balwner', 'Brice', 'Btisan']}
df_b = pd.DataFrame(raw_data, columns = ['subject_id', 'first_name', 'last_name'])
df_b
Out[8]:
- Merge는 DB의 Join과 같았다면, Concat은 보다 단순한 붙이기에 가깝다.
5. 데이터 Row 추가하기
In [9]:pd.concat([df_a, df_b]) # 밑으로 붙이기
Out[9]:
- concat 함수에 붙이고자 하는 데이터를 list형태로 제공하면,
- Out[9]와 같이 데이터가 위아래로 붙어 있는 것을 확인할 수 있다.
6. 데이터 Column/Series 추가하기
In [10]:pd.concat([df_a, df_b], axis=1)
Out[10]:
- Concat에 axis를 지정해주면, 원하는 axis를 기준으로 추가가 된다.
- default 가 axis=0이기 때문에, row가 추가된다.
- column을 추가하고 싶다면, axis=1을 명시해주어야 한다.
7. 관련 포스트
'Python과 머신러닝 > Pandas 데이터 분석' 카테고리의 다른 글
[Python.Pandas] String 관련 함수 총정리 (str.upper, .replace, .isdigit, .contains, .match, .split, .rename, .get_dummies) + one hot encoding (0) | 2020.12.30 |
---|---|
[Python.Pandas] Pivot Table과 CrossTab 사용하기 (0) | 2020.12.28 |
[Python.Pandas] Groupby 실습 / 데이터 분석 (Date/Time 데이터 분석) (0) | 2020.12.27 |
[Python.Pandas] Groupby 이해하기 - 2편 (0) | 2020.12.24 |
[Python.Pandas] Groupby 함수 이해하기 - 1편 (0) | 2020.12.23 |