[Pandas] Merging DataFrame

Jadon·2022년 2월 9일
1

DataFrame에 대해 정리하기 앞서, 벤 다이어그램을 사용해서 기본적인 개념에 대해 익혀보자.

왼쪽 원은 대학교 학생들이고 오른쪽 원은 대학교 스탭이다. 겹치는 부분은 학생이자 스탭인 사람들이다.

각 원을 하나의 DataFrame이라고 할 때, 두 원의 합집합, 즉 전체 인원을 불러오고 싶으면 데이터베이스 용어로 Full outer join을 사용한다. 집합 용어로는 교집합(Union)이라 한다.

두 DataFrame에서 학생이자 스탭인 사람들의 데이터만 이용하고 싶다면 Inner Join(intersection)을 사용하면 된다.

코드를 보며 이해해보자.

import pandas as pd

staff_df = pd.DataFrame([{'Name': 'Kelly', 'Role': 'Director of HR'},
                         {'Name': 'Sally', 'Role': 'Course liasion'},
                         {'Name': 'James', 'Role': 'Grader'}])

staff_df = staff_df.set_index('Name')

student_df = pd.DataFrame([{'Name': 'James', 'School': 'Business'},
                           {'Name': 'Mike', 'School': 'Law'},
                           {'Name': 'Sally', 'School': 'Engineering'}])
                           
student_df = student_df.set_index('Name')

print(staff_df.head())
print(student_df.head())
                 Role
Name                 
Kelly  Director of HR
Sally  Course liasion
James          Grader

            School
Name              
James     Business
Mike           Law
Sally  Engineering

set_index를 하지 않으면 0, 1, 2 형태로 자동으로 index가 생성된다.

두 DataFrame을 outer join 하게 되면 존재하지 않는 데이터는 NaN으로 자동 설정된다.

pd.merge(staff_df, student_df, how='outer', left_index=True, right_index=True)
		Role			School
Name	

James	Grader			Business
Kelly	Director of HR	NaN
Mike	NaN				Law
Sally	Course liasion	Engineering

두 DataFrame을 inner join 하게 되면 학생이자 스탭인 사람들만 가져온다.

pd.merge(staff_df, student_df, how='inner', left_index=True, right_index=True)
		Role			School
Name	

Sally	Course liasion	Engineering
James	Grader			Business

outer join과 inner join 외에 자주 사용되는 join은 left join과 right join이 있다. 각각 어떤 역할을 하는지 알아보자.

left join은 왼쪽에 있는 DataFrame을 기준으로 오른쪽에 해당하는 정보를 추가적으로 가져온다. 코드를 보며 이해해보자.

pd.merge(staff_df, student_df, how='left', left_index=True, right_index=True)
		Role			School
Name

Kelly	Director of HR	NaN
Sally	Course liasion	Engineering
James	Grader			Business

Staff_df에 있는 모든 row를 가져왔고 Student_df에 존재하는 column인 School을 추가적으로 가져온다. Left join이기 때문에 staff에 소속되지 않는 Mike는 제외된 것을 볼 수 있다.

Right join은 left join과 반대로 생각하면 쉽다. 코드를 보며 살펴보자.

pd.merge(staff_df, student_df, how='right', left_index=True, right_index=True)
		Role			School
Name		
James	Grader			Business
Mike	NaN				Law
Sally	Course liasion	Engineering

오른쪽 DataFrame인 Student_df를 기준으로 merge 되었고 Staff_df에 있는 Role column을 추가적으로 가져온 것을 볼 수 있다.

0개의 댓글