말랑말랑제리스타일

[Pandas] 두개의 DataFrame Join 본문

프로그래밍/파이썬

[Pandas] 두개의 DataFrame Join

제리제리 2022. 1. 24. 07:22

두개의 DataFrame을 합치는 방법은 크게 두가지입니다.

단순히 row에 붙여서 합치는 concat 함수와 인덱스 별로 붙여주는 join() 합수입니다.

1. 두개의 DataFrame 생성

바로 코드로 설명하기에 앞서 Pandas 기능을 이용해 join을 하기에 유의미한 데이터를 만들어보겠습니다.

train_df = pd.read_csv("/content/train.csv")
train_df['AgeBand'] = train_df.Age.map(lambda p: p//10)
train_df_p1 = train_df.loc[train_df.Pclass == 1].groupby(['Embarked','AgeBand']).apply(lambda p : p.loc[p.PassengerId.idxmax()])
train_df_p2 = train_df.loc[train_df.Pclass == 2].groupby(['Embarked','AgeBand']).apply(lambda p : p.loc[p.PassengerId.idxmax()])

csv 파일을 Pandas DataFrame으로 읽어오고 나이를 p//10 연산을 통해 AgeBand라는 항목을 만들어줍니다. 10세 이하는 0, 10대는 1, 20대는 2..이런 형태의 데이터가 될겁니다.

이 각각의 데이터를 groupby를 통해 DataFrame에 2개의 index를 생성해주고 index 당 하나의 row만 나오게 해주게 됩니다.

train_df_p2의 결과

다음으로 Pclass가 1과 2인 항목을 추려서 두개의 DataFrame을 만들어줍니다.

2. Index 설정과 두개의 DataFrame Join

지금부터 이 두개의 Pandas DataFrame을 join해보겠습니다.

train_df_p1 = train_df_p1.set_index(['Embarked','AgeBand'])
train_df_p2 = train_df_p2.set_index(['Embarked','AgeBand'])

train_df_p1.join(train_df_p2, lsuffix= '_P1',rsuffix= 'P2')

두개의 DataFrame Join을 위한 필수조건으로 Index가 설정되어야합니다.

Pandas에서 DataFrame Join은 index를 기준으로 left outer join이 기본이기 때문입니다. 

* left join이기 때문에 DataFrame의 Join 순서도 중요하게 작용합니다.

따라서 위 소스의 인덱스 설정이 필요하지만 우리는 이미 groupby를 통해 DataFrame에 Index를 설정해두었으므로 이 과정은 생략해도 됩니다.

그리고 최종적으로 Pandas의 join() 함수를 실행합니다.

매개변수로 lsuffix에는 left 테이블의 description에 포함할 문자열, rsuffix는 right 테이블의 description에 포함할 문자열입니다.

마지막으로 결과를 보여드리고 Pandas 기초는 이 글로 마무리짓도록 하겠습니다.

Comments