안녕하세요 한소희입니다. 공부를 통해 배운 내용을 작성하고 있습니다. 혹여 해당 포스팅에서 잘못된 부분이 있을 경우, 알려주시면 빠르게 수정 조치하도록 하겠습니다. 감사합니다.
데이터 분석을 할 때면, 데이터 셋을 병합해야 하는 일이 종종 생긴다.
왜냐하면 대부분의 데이터셋은 예쁘게 한 개의 세트 형태로 제공되지 않기 때문이다.
물론, 캐글이나 데이콘 같은 곳에서 제공하는 데이터는 예쁘게 잘 정제되어 있지만,
실제 현업에서 마주하는 데이터는 그렇지 않다.
(어쩌다 알게 되었냐고요? 저도 알고 싶지 않았습니다.. 따흑. 데이터 처리 스킬이 부족한 시절, 실습생 때 데이터 셋을 병합할 때 꽤나 골머리를 앓았던 것으로 기억한다. 데이터의 무결성 이슈 때문에..)
여튼, pandas에서는 이 데이터들을 병합하는 방법에서 merge와 concat 개념을 반드시 알아두어야 한다. 이들은 개념이 유사하면서도 다르기 때문에, 아래 정리한 내용을 숙지하여 적재적소에 활용하자.
Concat / Merge의 활용 방법
- concat 활용1 : 데이터셋 세로 병합
- concat 활용2 : 데이터셋 가로 병합
- merge : 데이터셋 가로 병합
Concat, Merge 차이점
- Concat은 다수의 데이터셋을 한 번에 병합 가능하나, Merge는 2개의 병합만 가능
- Merge는 'how'를 이용해 비교적 다양한 조건 별 데이터셋 병합이 가능
이제 본격적으로, merge와 concat을 어떻게 사용하면 되는지 basic한 활용 방법을 기록해보겠다.
목차
데이터셋 로드
concat 활용
merge 활용
01. 데이터 셋 로드
In [ ]:
# 필요한 라이브러리를 import 합니다.
import pandas as pd
In [ ]:
# 6개의 데이터셋을 한 번에 불러오는 함수를 만듭니다. (url: 비공개처리)
urlhead = '[비공개]'
def url(num):
df=pd.read_csv(urlhead+num+'.csv')
df=df.transpose() # 전치
header=df.iloc[0]
df.columns=header
df=df[1:]
df=df.filter(['매출액','자본총계','EPS(원)'],axis=1)
df.sort_index(axis=1)
return df[-1:]
In [ ]:
# 함수를 적용합니다.
df1=url('01')
df2=url('02')
df3=url('03')
df4=url('04')
df5=url('05')
df6=url('06')
Concat 활용 1. 데이터셋을 세로로 병합
In [ ]:
# Concat 활용 1: 앞서 출력한 데이터셋을 세로로 합칩니다.
data_concat=pd.concat([df1,df2,df3,df4,df5,df6])
Concat 활용 2. 데이터셋을 가로로 병합
In [ ]:
# 종목 별 종목명, 테마를 구분짓는 새로운 데이터셋을 만듭니다.
thema = pd.DataFrame(
{'종목' : ['000080', '000890', '005300', '027740', '035810', '136480'],
'종목명': ['하이트진로', '보해양조', '롯데칠성', '마니커', '이지홀딩스', '하림'],
'테마' : ['주류', '주류', '주류', '육계', '육계', '육계']})
thema
Out[ ]:
종목 | 종목명 | 테마 | |
---|---|---|---|
0 | 000080 | 하이트진로 | 주류 |
1 | 000890 | 보해양조 | 주류 |
2 | 005300 | 롯데칠성 | 주류 |
3 | 027740 | 마니커 | 육계 |
4 | 035810 | 이지홀딩스 | 육계 |
5 | 136480 | 하림 | 육계 |
In [ ]:
# Concat 활용 2: 앞서 출력한 데이터셋(data_concat, thema)을 세로로 합칩니다.
data_concat=pd.concat([data_concat.reset_index(),thema['종목명']], axis=1) #axis=1 : 행으로 합친다는 의미
data_concat
Out[ ]:
index | 매출액 | 자본총계 | EPS(원) | 종목명 | |
---|---|---|---|---|---|
0 | 2020/09\n(IFRS연결) | 6,243 | 10,897 | 453 | 하이트진로 |
1 | 2020/09\n(IFRS연결) | 205 | 816 | 3 | 보해양조 |
2 | 2020/09\n(IFRS연결) | 5,980 | 12,096 | 1,682 | 롯데칠성 |
3 | 2020/09\n(IFRS연결) | 521 | 624 | -61 | 마니커 |
4 | 2020/06\n(IFRS연결) | 4,108 | 7,534 | 1,168 | 이지홀딩스 |
5 | 2020/09\n(IFRS연결) | 2,613 | 2,695 | 62 | 하림 |
(추가) 간단한 Feature Engineering
In [ ]:
# 'index' Feature명을 '날짜'로 변경합니다.
# 날짜 데이터는 '\'을 중심으로 왼쪽에 위치하며, 오른쪽 값은 유의미한 값이 아닙니다. 따라서 '\'을 중심으로 왼쪽 값만 살리고, 나머지는 제거합니다.
data_concat=data_concat.rename({'index':'날짜'}, axis=1)
data_concat['날짜'] = data_concat['날짜'].str.split("\n").str[0]
data_concat
Out[ ]:
날짜 | 매출액 | 자본총계 | EPS(원) | 종목명 | |
---|---|---|---|---|---|
0 | 2020/09 | 6,243 | 10,897 | 453 | 하이트진로 |
1 | 2020/09 | 205 | 816 | 3 | 보해양조 |
2 | 2020/09 | 5,980 | 12,096 | 1,682 | 롯데칠성 |
3 | 2020/09 | 521 | 624 | -61 | 마니커 |
4 | 2020/06 | 4,108 | 7,534 | 1,168 | 이지홀딩스 |
5 | 2020/09 | 2,613 | 2,695 | 62 | 하림 |
In [ ]:
# Merge할 데이터셋을 생성합니다.
left = pd.DataFrame({'key1': ['K0', 'K0', 'K1', 'K2'],
'key2': ['K0', 'K1', 'K0', 'K1'],
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']})
right = pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K2'],
'key2': ['K0', 'K0', 'K0', 'K0'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']})
In [ ]:
# 데이터셋을 확인합니다 (1)
left
Out[ ]:
key1 | key2 | A | B | |
---|---|---|---|---|
0 | K0 | K0 | A0 | B0 |
1 | K0 | K1 | A1 | B1 |
2 | K1 | K0 | A2 | B2 |
3 | K2 | K1 | A3 | B3 |
In [ ]:
# 데이터셋을 확인합니다 (2)
right
Out[ ]:
key1 | key2 | C | D | |
---|---|---|---|---|
0 | K0 | K0 | C0 | D0 |
1 | K1 | K0 | C1 | D1 |
2 | K1 | K0 | C2 | D2 |
3 | K2 | K0 | C3 | D3 |
In [ ]:
# 'left' 데이터셋의 key를 기준으로 병합합니다.
answer=left.merge(right, how = 'left', on = ['key1','key2']) #how = left : 키를 left 기준으로 병합, outer : 모든 두 프레임 키 통합해 모두 병합, inner : 두 프레임 키 통합해 두 프레임이 모두 해당하는 키만 병합
answer
Out[ ]:
key1 | key2 | A | B | C | D | |
---|---|---|---|---|---|---|
0 | K0 | K0 | A0 | B0 | C0 | D0 |
1 | K0 | K1 | A1 | B1 | NaN | NaN |
2 | K1 | K0 | A2 | B2 | C1 | D1 |
3 | K1 | K0 | A2 | B2 | C2 | D2 |
4 | K2 | K1 | A3 | B3 | NaN | NaN |
'데이터 공부 > Python' 카테고리의 다른 글
Pandas - 고객 구매 데이터 데이터 전처리 연습 (0) | 2021.08.19 |
---|---|
05. 데이터 시각화 (0) | 2021.06.04 |
04. String Manipulation (0) | 2021.06.04 |
02. 데이터 Load, 라이브러리 import (0) | 2021.06.01 |
01. Pandas 기본사용법 / Ipynb 파일 -> HTML 파일 변환 방법 (0) | 2021.06.01 |