Python/NumPy | Pandas

[Python] Pandas - 데이터프레임 합성 1 (merge / join)

비번변경 2022. 12. 25. 01:02

개요

두 개 이상의 DataFrame을 합치는 병합 및 연결 방법을 정리한다.

 

 

DataFrame 병합(merge)

두 개의 DataFrame이 공통으로 가진 열이나 인덱스를 기준으로 테이블을 합친다. 기준이 되는 열, 또는 행 데이터를 Key라고 한다.

 

예로 들어 아래와 같은 두 개의 DataFrame이 있다고 하자.

df1 = pd.DataFrame({
    '고객번호': [1001, 1002, 1003, 1004, 1005, 1006, 1007],
    '이름': ['둘리', '도우너', '또치', '길동', '희동', '마이콜', '영희']
}, columns=['고객번호', '이름'])
df2 = pd.DataFrame({
    '고객번호': [1001, 1001, 1005, 1006, 1008, 1001],
    '금액': [10000, 20000, 15000, 5000, 100000, 30000]
}, columns=['고객번호', '금액'])

df1
df2

# 실행 결과
   고객번호   이름
0  1001   둘리
1  1002  도우너
2  1003   또치
3  1004   길동
4  1005   희동
5  1006  마이콜
6  1007   영희

   고객번호      금액
0  1001   10000
1  1001   20000
2  1005   15000
3  1006    5000
4  1008  100000
5  1001   30000

위 DataFrame을 merge 함수로 합치면, 두 DataFrame이 공통으로 가진 고객번호 Column을 기준으로 데이터를 합친다. 합칠 때는 기본적으로 inner join 방식을 사용한다.

pd.merge(df1, df2)

# 실행 결과
   고객번호   이름     금액
0  1001   둘리  10000
1  1001   둘리  20000
2  1001   둘리  30000
3  1005   희동  15000
4  1006  마이콜   5000

outer join 방식을 사용할 때는 아래와 같이 how 매개변수를 사용한다. outer라고 지정하는 경우에는 full outer join을, left 또는 right로 지정하는 경우에는 각각 left outer join, right outer join을 수행한다.

pd.merge(df1, df2, how='outer')
pd.merge(df1, df2, how='left')
pd.merge(df1, df2, how='right')

# 실행 결과
   고객번호   이름        금액
0  1001   둘리   10000.0
1  1001   둘리   20000.0
2  1001   둘리   30000.0
3  1002  도우너       NaN
4  1003   또치       NaN
5  1004   길동       NaN
6  1005   희동   15000.0
7  1006  마이콜    5000.0
8  1007   영희       NaN
9  1008  NaN  100000.0

   고객번호   이름       금액
0  1001   둘리  10000.0
1  1001   둘리  20000.0
2  1001   둘리  30000.0
3  1002  도우너      NaN
4  1003   또치      NaN
5  1004   길동      NaN
6  1005   희동  15000.0
7  1006  마이콜   5000.0
8  1007   영희      NaN

   고객번호   이름      금액
0  1001   둘리   10000
1  1001   둘리   20000
2  1005   희동   15000
3  1006  마이콜    5000
4  1008  NaN  100000
5  1001   둘리   30000

키 값이 같은 데이터가 여럿인 경우 가능한 모든 조합을 만들어낸다.

 

또한 merge 시 이름이 같은 열은 모두 키가 되기 때문에, 키가 되면 안 되는 열이 있는 경우에는 on 매개변수로 병합 기준 열을 명시해야 한다.

df1 = pd.DataFrame({
    '고객명': ['춘향', '춘향', '몽룡'],
    '날짜': ['2018-01-01', '2018-01-02', '2018-01-01'],
    '데이터': ['20000', '30000', '100000']})
df2 = pd.DataFrame({
    '고객명': ['춘향', '몽룡'],
    '데이터': ['여자', '남자']})
df1
df2
pd.merge(df1, df2, on='고객명')

  고객명          날짜     데이터
0  춘향  2018-01-01   20000
1  춘향  2018-01-02   30000
2  몽룡  2018-01-01  100000

  고객명 데이터
0  춘향  여자
1  몽룡  남자

  고객명          날짜   데이터_x 데이터_y
0  춘향  2018-01-01   20000    여자
1  춘향  2018-01-02   30000    여자
2  몽룡  2018-01-01  100000    남자

기준 열이 아니면서 이름이 같은 열은 _x, _y와 같은 접미사가 붙는다.

 

키가 되어야 하는 기준 열의 이름이 다르다면 left_on, right_on 매개변수로 기준 열을 명시해야 한다.

df1 = pd.DataFrame({
    '이름': ['영희', '철수', '철수'],
    '성적': [1, 2, 3]})
df2 = pd.DataFrame({
    '성명': ['영희', '영희', '철수'],
    '성적2': [4, 5, 6]})
df1
df2
pd.merge(df1, df2, left_on='이름', right_on='성명')

# 실행 결과
   이름  성적
0  영희   1
1  철수   2
2  철수   3

   성명  성적2
0  영희    4
1  영희    5
2  철수    6

   이름  성적  성명  성적2
0  영희   1  영희    4
1  영희   1  영희    5
2  철수   2  철수    6
3  철수   3  철수    6

 

일반 데이터 열이 아니라 index를 기준으로 병합해야 할 때는 left_index, right_index 매개변수를 True로 지정해야 한다.

df1 = pd.DataFrame({
    '도시': ['서울', '서울', '서울', '부산', '부산'],
    '연도': [2000, 2005, 2010, 2000, 2005],
    '인구': [9853972, 9762546, 9631482, 3655437, 3512547]})
df2 = pd.DataFrame(
    np.arange(12).reshape((6, 2)),
    index=[['부산', '부산', '서울', '서울', '서울', '서울'],
           [2000, 2005, 2000, 2005, 2010, 2015]],
    columns=['데이터1', '데이터2'])
df1
df2
pd.merge(df1, df2, left_on=['도시', '연도'], right_index=True)

# 실행 결과
   도시    연도       인구
0  서울  2000  9853972
1  서울  2005  9762546
2  서울  2010  9631482
3  부산  2000  3655437
4  부산  2005  3512547

         데이터1  데이터2
부산 2000     0     1
     2005     2     3
서울 2000     4     5
     2005     6     7
     2010     8     9
     2015    10    11
     
   도시    연도       인구  데이터1  데이터2
0  서울  2000  9853972     4     5
1  서울  2005  9762546     6     7
2  서울  2010  9631482     8     9
3  부산  2000  3655437     0     1
4  부산  2005  3512547     2     3

 

 

JOIN 함수

merge 함수 대신 join 함수를 사용해도 된다.

df1 = pd.DataFrame(
    [[1., 2.], [3., 4.], [5., 6.]],
    index=['a', 'c', 'e'],
    columns=['서울', '부산'])
df2 = pd.DataFrame(
    [[7., 8.], [9., 10.], [11., 12.], [13, 14]],
    index=['b', 'c', 'd', 'e'],
    columns=['대구', '광주'])
df1
df2
df1.join(df2, how='outer')

# 실행 결과
    서울   부산
a  1.0  2.0
c  3.0  4.0
e  5.0  6.0

     대구    광주
b   7.0   8.0
c   9.0  10.0
d  11.0  12.0
e  13.0  14.0

    서울   부산    대구    광주
a  1.0  2.0   NaN   NaN
b  NaN  NaN   7.0   8.0
c  3.0  4.0   9.0  10.0
d  NaN  NaN  11.0  12.0
e  5.0  6.0  13.0  14.0

 

 

참고 문서

데이터 사이언스 스쿨 - 4.6 데이터프레임 합성