데이터 분석을 시작하면 다양한 파일들을 다루게 된다. 특히 데이터 파일들이 여러 개로 나뉘어져 있을 때, 이 파일들을 합쳐야 원하는 정보를 얻을 수 있는 경우가 많다.
이런 상황에서 사용하는 것이 바로 concat과 **merge** 함수이다.
예를 들어, 도서관에서 받은 여러 파일을 합쳐 특정 회원의 도서 대출 기록을 확인해야 할 때 유용하다.
데이터를 나눠서 저장하는 이유는 주로 보안과 효율성 때문이다.
예를 들어, 모든 데이터를 한 파일에 저장하면 데이터 손실의 위험이 커지고 관리가 복잡해진다.
반면, 데이터를 나눠서 저장하면 손실 위험이 줄어들고, 보안 또한 강화할 수 있다.
예를 들어, 도서관 회원 정보와 대출 기록을 분리하면 회원 정보는 보호하면서도 대출 기록은 쉽게 관리할 수 있다.'
데이터 준비하기
먼저, 필요한 패키지를 import 하고 데이터를 생성한다.
import pandas as pd
# 학생 데이터 생성
student_data = {
"Code": [101, 102],
"Name": ["Andrew", "Clara"]
}
# 보유 도서 데이터 생성
book_data = {
"ID": [1, 2],
"Title": ["Alice's Adventures in Wonderland", "A Little Princess"]
}
# 각각의 데이터 프레임 생성
student_df = pd.DataFrame(student_data)
book_df = pd.DataFrame(book_data)
# 5월 대출 기록 데이터 생성
check_out_data_may = {
"Code": [101, 102],
"ID": [1, 2],
"Date": ["2020-05-02", "2020-05-03"]
}
# 6월 대출 기록 데이터 생성
check_out_data_june = {
"Code": [101],
"ID": [2],
"Date": ["2020-06-02"]
}
# 각각의 데이터 프레임 생성
check_out_df_may = pd.DataFrame(check_out_data_may)
check_out_df_june = pd.DataFrame(check_out_data_june)
concat은 데이터 프레임을 단순히 합칠 때 사용한다.
예를 들어, 5월과 6월의 도서 대출 기록을 합쳐보자.
check_out_df = pd.concat([check_out_df_may, check_out_df_june])
check_out_df = check_out_df.reset_index(drop=True)
Code ID Date
0 101 1 2020-05-02
1 102 2 2020-05-03
2 101 2 2020-06-02
이제, 5월과 6월의 도서 대출 기록이 하나의 데이터 프레임에 합쳐졌다.
join 매개변수를 사용하여 concat 시 공통 열을 기준으로 데이터 프레임을 합칠 수 있다. join 매개변수의 기본값은 outer이며, 이를 통해 공통 열이 모두 포함된 데이터 프레임을 얻을 수 있다. inner로 설정하면 공통된 부분만 남게 된다.
# 열 방향으로 데이터 프레임을 합침
concat_df = pd.concat([student_df.set_index('Code'), check_out_df.set_index('Code')], axis=1, join='inner')
print(concat_df)
Name ID Date
Code
101 Andrew 1 2020-05-02
101 Andrew 2 2020-06-02
102 Clara 2 2020-05-03
그래서 join을 사용하면 merge와 비슷한 결과를 얻을 수 있지만, concat은 단순히 데이터 프레임을 이어붙이는 것에 중점을 둔다고 할 수 있다.
merge는 공통된 항목을 기준으로 두 데이터 프레임을 합친다.
예를 들어, 학생 정보와 도서 대출 기록을 합쳐보자.
merge_inner = pd.merge(student_df, check_out_df, on="Code", how="inner")
Code Name ID Date
0 101 Andrew 1 2020-05-02
1 101 Andrew 2 2020-06-02
2 102 Clara 2 2020-05-03
이렇게 하면 도서 대출 기록이 있는 학생들의 정보가 출력된다.
그리고 merge를 하는 방법에는 총 네 가지 방법이 있다.
inner: 교집합merge_inner = pd.merge(student_df, check_out_df, on="Code", how="inner")
left: 왼쪽 데이터 프레임을 기준으로 합침merge_left = pd.merge(student_df, check_out_df, on="Code", how="left")
right: 오른쪽 데이터 프레임을 기준으로 합침merge_right = pd.merge(student_df, check_out_df, on="Code", how="right")
outer: 합집합merge_outer = pd.merge(student_df, check_out_df, on="Code", how="outer")