[python 활용하기#13] Pandas 데이터프레임 병합하기(merge)
안녕하세요. 심심한 코딩쟁이입니다.
오늘은 Pandas의 데이터프레임을 병합하는 방법에 대해 알아보려 합니다.
다른 인덱스로 구성되어 있는 데이터 프레임을 병합하는 코드를 만들어두었다가
필요에 따라 약간씩 변형해서 사용하시면 업무처리에 아주 큰 도움이 되리라 생각됩니다.
같이 살펴보시죠.
데이터 살펴보기
본 포스팅에서 사용할 데이터의 형태는 다음과 같습니다.
Sheet1 에 존재하는 데이터
이름 | 학번 | 학과 |
이기철 | 20231111 | 고무신과 |
이기형 | 20231112 | 고무신과 |
노진구 | 20231113 | 발명과 |
신짱구 | 20231114 | 유아교육과 |
남도일 | 20231115 | 심리추리과 |
Sheet2 에 존재하는 데이터
학과 | OT 장소 |
고무신과 | 1 강의동 |
심리추리과 | 2 강의동 |
발명과 | 3 강의동 |
유아교육과 | 4 강의동 |
체육과 | 5 강의동 |
화학과 | 6 강의동 |
물리과 | 7 강의동 |
생믈과 | 8 강의동 |
데이터 읽어오기
import pandas as pd
import openpyxl as opxl
df = []
for name in opxl.load_workbook("test.xlsx").sheetnames:
tmp_df = pd.read_excel("test.xlsx", sheet_name=name)
df.append(tmp_df)
print(df)
위 코드를 이용하면 각 시트에 존재하는 데이터를 담은 데이터프레임을 리스트에 담아 사용할 수 있습니다.
데이터 프레임 병합하기 merge
데이터프레임을 병합하는 방법은 다양하지만 how 인수를 사용해 병합하는 방법을 알아봅시다.
import openpyxl as opxl
df_list = []
for name in opxl.load_workbook("test.xlsx").sheetnames:
tmp_df = pd.read_excel("test.xlsx", sheet_name=name)
df_list.append(tmp_df)
merged_df = df_list[0].merge(df_list[1], how = 'left', on = '학과')
print(merged_df)
print("-------구분선-------")
merged_df = df_list[0].merge(df_list[1], how = 'right', on = '학과')
print(merged_df)
### 출력 결과 ###########################
이름 학번 학과 OT 장소
0 이기철 202311111 고무신과 1 강의동
1 이기형 202311112 고무신과 1 강의동
2 노진구 202311113 발명과 3 강의동
3 신짱구 202311114 유아교육과 4 강의동
4 남도일 202311115 심리추리과 2 강의동
-------구분선-------
이름 학번 학과 OT 장소
0 이기철 202311111.0 고무신과 1 강의동
1 이기형 202311112.0 고무신과 1 강의동
2 남도일 202311115.0 심리추리과 2 강의동
3 노진구 202311113.0 발명과 3 강의동
4 신짱구 202311114.0 유아교육과 4 강의동
5 NaN NaN 체육과 5 강의동
6 NaN NaN 화학과 6 강의동
7 NaN NaN 물리과 7 강의동
8 NaN NaN 생물과 8 강의동
#############################################
merge 함수를 사용할 때 어떤 데이터프레임의 어떤 인덱스를 기준으로 삼고 병합을 진행할 것인지를
잘 설정해주어야 합니다.
위 코드의 결과만 보더라도 how 인수에 왼쪽 오른쪽 같을 달리했더니 전혀 다른 결과가 도출되는 것을 볼 수 있습니다.
다음은 양쪽 데이터프레임이 모두 가지고 있는 인덱스를 기준으로 병합하는 방법입니다.
기준으로 하는 인덱스로 교집합을 진행한다고 생각하시면 됩니다.
import pandas as pd
import openpyxl as opxl
df_list = []
for name in opxl.load_workbook("test.xlsx").sheetnames:
tmp_df = pd.read_excel("test.xlsx", sheet_name=name)
df_list.append(tmp_df)
merged_df = df_list[0].merge(df_list[1], how = 'inner', on = '학과')
print(merged_df)
### 출력 결과 #############################
이름 학번 학과 OT 장소
0 이기철 202311111 고무신과 1 강의동
1 이기형 202311112 고무신과 1 강의동
2 노진구 202311113 발명과 3 강의동
3 신짱구 202311114 유아교육과 4 강의동
4 남도일 202311115 심리추리과 2 강의동
###########################################
병합 후에 두 전째 데이터프레임에 존재하는 'OT 장소'라는 인덱스가 생긴 것을 볼 수 있습니다.
다음은 양쪽 데이터프레임의 인덱스 모두를 기준으로 병합을 해보겠습니다.
합집합과 비슷한 방식이라고 생각하시면 되겠습니다.
import pandas as pd
import openpyxl as opxl
df_list = []
for name in opxl.load_workbook("test.xlsx").sheetnames:
tmp_df = pd.read_excel("test.xlsx", sheet_name=name)
df_list.append(tmp_df)
merged_df = df_list[0].merge(df_list[1], how = 'outer', on = '학과')
print(merged_df)
### 출력 결과 ###############################
이름 학번 학과 OT 장소
0 이기철 202311111.0 고무신과 1 강의동
1 이기형 202311112.0 고무신과 1 강의동
2 노진구 202311113.0 발명과 3 강의동
3 신짱구 202311114.0 유아교육과 4 강의동
4 남도일 202311115.0 심리추리과 2 강의동
5 NaN NaN 체육과 5 강의동
6 NaN NaN 화학과 6 강의동
7 NaN NaN 물리과 7 강의동
8 NaN NaN 생물과 8 강의동
#############################################
첫 번째 데이터프레임에 존재하지 않는 학과에 대해서는 이름과 학번에 들어갈 값이 없어서 NaN으로 표기됨
merge 후에 학번의 타입이 float64로 나오는 것이 마음에 들지 않는다면 다음과 같이 바꿔줄 수 있습니다.
import pandas as pd
import openpyxl as opxl
df_list = []
for name in opxl.load_workbook("test.xlsx").sheetnames:
tmp_df = pd.read_excel("test.xlsx", sheet_name=name)
df_list.append(tmp_df)
merged_df = df_list[0].merge(df_list[1], how = 'outer', on = '학과')
# 추가해줘야할 부분 ######################################################################
import numbers
import math
merged_df['학번'] = [int(id) if isinstance(id, numbers.Number) &
(math.isnan(id)==False) else 'NaN' for id in merged_df['학번']]
##########################################################################################
print(merged_df)
### 출력 결과 #############################
이름 학번 학과 OT 장소
0 이기철 202311111 고무신과 1 강의동
1 이기형 202311112 고무신과 1 강의동
2 노진구 202311113 발명과 3 강의동
3 신짱구 202311114 유아교육과 4 강의동
4 남도일 202311115 심리추리과 2 강의동
5 NaN NaN 체육과 5 강의동
6 NaN NaN 화학과 6 강의동
7 NaN NaN 물리과 7 강의동
8 NaN NaN 생물과 8 강의동
###########################################
여기까지 파이썬 판다스의 데이터프레임 병합하기에 대해서 알아보았습니다.
병합 후 나온 결과를 엑셀에 옮기고 싶으실 경우 아래 링크를 참고하셔서
클립보드로 데이터를 옮기는 방법에 대해서 익혀가시길 바랍니다.
[python 활용하기#12] Pandas 여러 시트 통합 후 피벗테이블 만들기
[python 활용하기#12] Pandas 여러 시트 통합 후 피벗테이블 만들기
[python 활용하기#12] Pandas 여러 시트 통합 후 피벗테이블 만들기 안녕하세요. 심심한 코딩쟁이입니다. 오늘은 직장인들의 친구 피벗테이블을 파이썬의 Pandas로 다루는 방법을 알아보려합니다. 여
symxsym.tistory.com
감사합니다.
'programming > python' 카테고리의 다른 글
[python 활용하기#12] Pandas 여러 시트 통합 후 피벗테이블 만들기 (0) | 2023.03.23 |
---|---|
[Python 활용하기#11] Pandas 데이터 다루기 (데이터프레임) (0) | 2023.03.17 |
[python 활용하기 #10] 행렬 연산 방법 (사칙연산, 행렬 곱, 내적, 외적) (0) | 2023.03.13 |
[python 활용하기#9] 파이썬 numpy 설치하기 (0) | 2023.03.12 |
[python 활용하기 #8] openpyxl 글꼴 다루기 - 파이썬 엑셀 (0) | 2023.03.11 |