14 min to read Python
[Pandas] DataFrame 병합 메서드(concat(), merge())
DataFrame 병합하기
– 1. pd.concat()
– 2. pd.merge()
먼저 연습용 DataFrame을 3개 생성해보자.
>>> import pandas as pd
>>> df1 = pd.DataFrame([['A0', 'A1', 'A2', 'A3'],
... ['B0', 'B1', 'B2', 'B3'],
... ['C0', 'C1', 'C2', 'C3'],
... ['D0', 'D1', 'D2', 'D3']], columns=list('ABCD'))
>>> df2 = pd.DataFrame([['A4', 'A5', 'A6', 'A7'],
... ['B4', 'B5', 'B6', 'B7'],
... ['C4', 'C5', 'C6', 'C7'],
... ['D4', 'D5', 'D6', 'D7']], columns=['A', 'B', 'C', 'D'], index=[4, 5, 6, 7])
>>> df3 = pd.DataFrame([['A8', 'A9', 'A10', 'A11'],
... ['B8', 'B9', 'B10', 'B11'],
... ['C8', 'C9', 'C10', 'C11'],
... ['D8', 'D9', 'D10', 'D11']], columns=list('ABCD'), index=[8, 9, 10, 11])
>>> df1
A B C D
0 A0 A1 A2 A3
1 B0 B1 B2 B3
2 C0 C1 C2 C3
3 D0 D1 D2 D3
>>> df2
A B C D
4 A4 A5 A6 A7
5 B4 B5 B6 B7
6 C4 C5 C6 C7
7 D4 D5 D6 D7
>>> df3
A B C D
8 A8 A9 A10 A11
9 B8 B9 B10 B11
10 C8 C9 C10 C11
11 D8 D9 D10 D11
1. pd.concat()
– Pandas doc: Pandas.concat
– 살펴볼 옵션들: axis
, join_axes
, ignore_index
열 방향 병합이 default
>>> pd.concat([df1, df2, df3])
A B C D
0 A0 A1 A2 A3
1 B0 B1 B2 B3
2 C0 C1 C2 C3
3 D0 D1 D2 D3
4 A4 A5 A6 A7
5 B4 B5 B6 B7
6 C4 C5 C6 C7
7 D4 D5 D6 D7
8 A8 A9 A10 A11
9 B8 B9 B10 B11
10 C8 C9 C10 C11
11 D8 D9 D10 D11
– axis=1
옵션을 통한 행 방향 병합
>>> pd.concat([df1, df2, df3], axis=1)
A B C D A B C D A B C D
0 A0 A1 A2 A3 NaN NaN NaN NaN NaN NaN NaN NaN
1 B0 B1 B2 B3 NaN NaN NaN NaN NaN NaN NaN NaN
2 C0 C1 C2 C3 NaN NaN NaN NaN NaN NaN NaN NaN
3 D0 D1 D2 D3 NaN NaN NaN NaN NaN NaN NaN NaN
4 NaN NaN NaN NaN A4 A5 A6 A7 NaN NaN NaN NaN
5 NaN NaN NaN NaN B4 B5 B6 B7 NaN NaN NaN NaN
6 NaN NaN NaN NaN C4 C5 C6 C7 NaN NaN NaN NaN
7 NaN NaN NaN NaN D4 D5 D6 D7 NaN NaN NaN NaN
8 NaN NaN NaN NaN NaN NaN NaN NaN A8 A9 A10 A11
9 NaN NaN NaN NaN NaN NaN NaN NaN B8 B9 B10 B11
10 NaN NaN NaN NaN NaN NaN NaN NaN C8 C9 C10 C11
11 NaN NaN NaN NaN NaN NaN NaN NaN D8 D9 D10 D11
join 옵션을 살펴보기 위해
데이터 프레임을 하나 더 만들어서 살펴보자.
>>> df4 = pd.DataFrame({'B': ['B2', 'B3', 'B6', 'B7'],
... 'D': ['D2', 'D3', 'D6', 'D7'],
... 'F': ['F2', 'F3', 'F6', 'F7']}, index=[2, 3, 6, 7])
>>> df4
B D F
2 B2 D2 F2
3 B3 D3 F3
6 B6 D6 F6
7 B7 D7 F7
– join
옵션
‘outer’가 default
>>> pd.concat([df1, df4], axis=1)
A B C D B D F
0 A0 A1 A2 A3 NaN NaN NaN
1 B0 B1 B2 B3 NaN NaN NaN
2 C0 C1 C2 C3 B2 D2 F2
3 D0 D1 D2 D3 B3 D3 F3
6 NaN NaN NaN NaN B6 D6 F6
7 NaN NaN NaN NaN B7 D7 F7
>>> pd.concat([df1, df4], axis=1, join='outer')
A B C D B D F
0 A0 A1 A2 A3 NaN NaN NaN
1 B0 B1 B2 B3 NaN NaN NaN
2 C0 C1 C2 C3 B2 D2 F2
3 D0 D1 D2 D3 B3 D3 F3
6 NaN NaN NaN NaN B6 D6 F6
7 NaN NaN NaN NaN B7 D7 F7
>>> pd.concat([df1, df4], axis=1, join='inner')
A B C D B D F
2 C0 C1 C2 C3 B2 D2 F2
3 D0 D1 D2 D3 B3 D3 F3
– join_axes
옵션
특정 DataFrame의 인덱스만을 취할 수 있다. (left join like)
>>> pd.concat([df1, df4], axis=1, join_axes=[df1.index])
A B C D B D F
0 A0 A1 A2 A3 NaN NaN NaN
1 B0 B1 B2 B3 NaN NaN NaN
2 C0 C1 C2 C3 B2 D2 F2
3 D0 D1 D2 D3 B3 D3 F3
– ignore_index
옵션
인덱스를 무시하고 병합 후, 다시 인덱스를 부여함.
>>> pd.concat([df1, df4], ignore_index=True)
A B C D F
0 A0 A1 A2 A3 NaN
1 B0 B1 B2 B3 NaN
2 C0 C1 C2 C3 NaN
3 D0 D1 D2 D3 NaN
4 NaN B2 NaN D2 F2
5 NaN B3 NaN D3 F3
6 NaN B6 NaN D6 F6
7 NaN B7 NaN D7 F7
2. pd.merge()
– Pandas doc: Pandas.merge
– 공통 칼럼을 기준으로 join가능
– 살펴볼 옵션들: on
, how
먼저 연습용 데이터 생성
>>> left = pd.DataFrame({'key': ['K0', 'K4', 'K2', 'K3'],
... 'A': ['A0', 'A4', 'A2', 'A3'],
... 'B': ['B0', 'B4', 'B2', 'B3']})
>>> right = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
... 'C': ['C0', 'C1', 'C2', 'C3'],
... 'D': ['D0', 'D1', 'D2', 'D3']})
>>> left
A B key
0 A0 B0 K0
1 A4 B4 K4
2 A2 B2 K2
3 A3 B3 K3
>>> right
C D key
0 C0 D0 K0
1 C1 D1 K1
2 C2 D2 K2
3 C3 D3 K3
공통 칼럼인 ‘key’를 기준으로 join 해보자.
on
옵션을 통해 기준을 정할 수 있다.
how
옵션은 ‘inner’가 default
>>> pd.merge(left, right, on='key')
A B key C D
0 A0 B0 K0 C0 D0
1 A2 B2 K2 C2 D2
2 A3 B3 K3 C3 D3
>>> pd.merge(left, right, on='key', how='inner')
A B key C D
0 A0 B0 K0 C0 D0
1 A2 B2 K2 C2 D2
2 A3 B3 K3 C3 D3
>>> pd.merge(left, right, on='key', how='outer')
A B key C D
0 A0 B0 K0 C0 D0
1 A4 B4 K4 NaN NaN
2 A2 B2 K2 C2 D2
3 A3 B3 K3 C3 D3
4 NaN NaN K1 C1 D1
>>> pd.merge(left, right, on='key', how='left')
A B key C D
0 A0 B0 K0 C0 D0
1 A4 B4 K4 NaN NaN
2 A2 B2 K2 C2 D2
3 A3 B3 K3 C3 D3
>>> pd.merge(left, right, on='key', how='right')
A B key C D
0 A0 B0 K0 C0 D0
1 A2 B2 K2 C2 D2
2 A3 B3 K3 C3 D3
3 NaN NaN K1 C1 D1