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을 추가적으로 가져온 것을 볼 수 있다.