파이썬(Python)

파이썬(python) : pandas DataFrame 병합과 연결 merge, concat

알통몬_ 2018. 1. 23. 17:30
반응형


공감 및 댓글은 포스팅 하는데

 아주아주 큰 힘이 됩니다!!

포스팅 내용이 찾아주신 분들께 

도움이 되길 바라며

더 깔끔하고 좋은 포스팅을 

만들어 나가겠습니다^^

 


데이터의 특성 상 하나의 파일로 표현하기에 양이 많기에 분석 과정에서는

필요에 따라 파일들을 DataFrame으로 읽어들인 뒤에 하나의 DataFrame으로

종합하여 분석해야 하는 경우가 종종 발생하는데요.


서로 다른 2개의 DataFrame을 하나로 합치는 작업을 두 가지로 구분할 수 있는데요.

연결 :하나의 DataFrame에 다른 DataFrame을 연속적으로 붙이는 방법

두 DataFrame에 서로 동일한 인덱스나 컬럼을 가지는 경우가 많음.

 

병합 : 두 DataFrame에 공통적으로 포함되어 있는 하나의 열을 기준으로 삼아

해당 열의 값이 동일한 두 개의 행들을 하나의 행으로 합치는 방법이 있습니다.


 병합(Merging)

필요한 라이브러리를 추가하고, 2개의 DataFrame을 만들었습니다.

병합을 할 때는 merge 라는 함수를 사용합니다.

on="" 에는 병합을 할 때 기준이 되는 열 이름을 넣어주면 됩니다.

how라는 속성을 추가하지 않으면 RDBMS에서의 inner join과 같은 병합을 하고

how에 outer 라는 인자를 입력해주면 outer join과 같은 병합을 합니다.

그리고 left 라는 인자를 주게 되면 앞에 있는 DataFrame인자를 기준으로 병합을 합니다.


위의 경우 df2에는 중복된 값이 없었는데요.

만약 병합을 하려는 2개의 DataFrame 모두에 중복된 값이 있을 경우는 

어떤 결과가 나올까요?

df1 에는 b와 a가 중복되고, df2에도 a와 b가 중복되도록 만들었습니다.

병합을 하게 되면???

조합을 찾아놓은 것처럼 df1의 0번 인덱스의 b가 0일 때 df2의 인덱스 중 b가 있는 인덱스 값 ......처럼 병합이 되었네요.


위에서는 컬럼이름이 같았기 때문에 on="key" 처럼 기준이 되는 컬럼을 쉽게 설정했는데요.

그렇다면 기준이 되는 컬럼 이름이 서로 다르다면 어떻게 해야할까요?

이것 또한 어렵지 않습니다. on="" 대신에 left_on="", right_on="" 이 두 속성을 넣어주면 됩니다.


하나의 DataFrame에서는 컬럼 값을, 하나의 DataFrame에서는 인덱스를 통해 병합을

할 수도 있습니다.

코드만 봐도 이해하실 수 있을 거라고 믿습니다 ㅎㅎ


두 DataFrame 둘 다 인덱스를 기준으로 병합을 할 수도 있습니다.


연결(Concatenating) 

하나의 DataFrame에 다른 하나의 DataFrame을 열방향이나 행방향으로 연결하는 방법입니다.

세 개의 Series를 만들고 열 방향으로 연결해보겠습니다.

연결에는 concat() 함수를 사용합니다.

s1 뒤에 s2가 연결되고 s2 뒤에 s3가 연결되는 코드입니다.

axis=1 속성을 줄 수도 있는데요. 설정하지 않았을 때와는 다르게

Series가 아닌 DataFrame이 생성됩니다. 그리고 서로 중복되는 값이 없기 때문에

NaN이 채워진 것을 볼 수 있습니다.

키 값을 선언해서 만들 수도 있습니다.


concat 함수 사용 시 두 DataFrame의 인덱스 번호가 겹칠 때는 어떻게 연결이 될까요?

그냥 연결할 경우 인덱스 번호가 그대로 붙어버리는 것을 볼 수 있습니다.

이런게 좀 보기가 안 좋으니, 

ignore_index=True 속성을 사용하면 좀 더 보기 좋게 연결할 수 있습니다.




다음 포스팅에서는 DataFrame의 계층적 인덱싱에 대해 공부합니다.

감사합니다.

반응형