본문 바로가기

programming/python

[python 활용하기#13] Pandas 데이터프레임 병합하기(merge)

[python 활용하기#13] Pandas 데이터프레임 병합하기(merge)

 

안녕하세요. 심심한 코딩쟁이입니다.

 

오늘은 Pandas의 데이터프레임을 병합하는 방법에 대해 알아보려 합니다.

 

다른 인덱스로 구성되어 있는 데이터 프레임을 병합하는 코드를 만들어두었다가

 

필요에 따라 약간씩 변형해서 사용하시면 업무처리에 아주 큰 도움이 되리라 생각됩니다.

 

같이 살펴보시죠.

 

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

 

감사합니다.

반응형