데이터 결합(병합) .merge()¶
병합은 서로다른 데이터프레임 객체에 동일하게 존재하는 값을 통해 양쪽 데이터를 연관 지어 하나의 데이터프레임으로 모델링할 수 있는 유용한 방법입니다.
kospi = pd.read_csv("./^KS11.csv", index_col ='Date')
kospi.head()
Open | High | Low | Close | Adj Close | Volume | |
---|---|---|---|---|---|---|
Date | ||||||
2020-12-28 | 2820.949951 | 2834.590088 | 2799.560059 | 2808.600098 | 2808.600098 | 1006200 |
2020-12-29 | 2810.550049 | 2823.439941 | 2792.060059 | 2820.510010 | 2820.510010 | 1046800 |
2020-12-30 | 2820.360107 | 2878.209961 | 2809.350098 | 2873.469971 | 2873.469971 | 1074000 |
2021-01-04 | 2874.500000 | 2946.540039 | 2869.110107 | 2944.449951 | 2944.449951 | 1026500 |
2021-01-05 | 2943.669922 | 2990.570068 | 2921.840088 | 2990.570068 | 2990.570068 | 1519900 |
2개의 데이트 프레임을 연결할 정보를 'Ticker'라는 컬럼으로 설정하기 위해 'Ticker'컬럼을 추가합니다. 그리고 병합에 사용할 Ticker와 Volume 컬럼을 갖는 새로운 데이터프레임을 생성합니다.
kospi_volume = pd.DataFrame ({'Ticker': 'kospi', 'Volume' : kospi['Volume']})
kospi_volume
Ticker | Volume | |
---|---|---|
Date | ||
2020-12-28 | kospi | 1006200 |
2020-12-29 | kospi | 1046800 |
2020-12-30 | kospi | 1074000 |
2021-01-04 | kospi | 1026500 |
2021-01-05 | kospi | 1519900 |
... | ... | ... |
2021-12-20 | kospi | 377100 |
2021-12-21 | kospi | 410500 |
2021-12-22 | kospi | 461400 |
2021-12-23 | kospi | 483300 |
2021-12-24 | kospi | 537500 |
247 rows × 2 columns
2개의 데이터프레임이 함께 갖는 컬럼인 'Ticker'를 통해서 'Volume'정보를 가져오기 위해서 kospi 데이터프레임의 'Volume' 컬럼은 삭제합니다.
kospi['Ticker'] = 'kospi'
kospi.pop('Volume')
kospi.head()
Open | High | Low | Close | Adj Close | Ticker | |
---|---|---|---|---|---|---|
Date | ||||||
2020-12-28 | 2820.949951 | 2834.590088 | 2799.560059 | 2808.600098 | 2808.600098 | kospi |
2020-12-29 | 2810.550049 | 2823.439941 | 2792.060059 | 2820.510010 | 2820.510010 | kospi |
2020-12-30 | 2820.360107 | 2878.209961 | 2809.350098 | 2873.469971 | 2873.469971 | kospi |
2021-01-04 | 2874.500000 | 2946.540039 | 2869.110107 | 2944.449951 | 2944.449951 | kospi |
2021-01-05 | 2943.669922 | 2990.570068 | 2921.840088 | 2990.570068 | 2990.570068 | kospi |
.merge()기능을 사용하면 2개의 데이터프레인에서 동일하게 갖는 컬럼인 'Ticker'를 이용하여 데이터를 병합합니다. kospi 데이터 프레임에서 삭제 했던 Volume컬럼이 .merge() 과정을 통해서 다시 추가되었습니다.
kospi.merge(kospi_volume)
Open | High | Low | Close | Adj Close | Ticker | Volume | |
---|---|---|---|---|---|---|---|
0 | 2820.949951 | 2834.590088 | 2799.560059 | 2808.600098 | 2808.600098 | kospi | 1006200 |
1 | 2820.949951 | 2834.590088 | 2799.560059 | 2808.600098 | 2808.600098 | kospi | 1046800 |
2 | 2820.949951 | 2834.590088 | 2799.560059 | 2808.600098 | 2808.600098 | kospi | 1074000 |
3 | 2820.949951 | 2834.590088 | 2799.560059 | 2808.600098 | 2808.600098 | kospi | 1026500 |
4 | 2820.949951 | 2834.590088 | 2799.560059 | 2808.600098 | 2808.600098 | kospi | 1519900 |
... | ... | ... | ... | ... | ... | ... | ... |
61004 | 3009.479980 | 3025.770020 | 3009.479980 | 3012.429932 | 3012.429932 | kospi | 377100 |
61005 | 3009.479980 | 3025.770020 | 3009.479980 | 3012.429932 | 3012.429932 | kospi | 410500 |
61006 | 3009.479980 | 3025.770020 | 3009.479980 | 3012.429932 | 3012.429932 | kospi | 461400 |
61007 | 3009.479980 | 3025.770020 | 3009.479980 | 3012.429932 | 3012.429932 | kospi | 483300 |
61008 | 3009.479980 | 3025.770020 | 3009.479980 | 3012.429932 | 3012.429932 | kospi | 537500 |
61009 rows × 7 columns
키 값이 여러개인 경우 병합방법¶
병합을 진행하려는 데이터프레임에서 키로 사용될 커럼이 여러 개일 경우 연관 컬럼을 지정할 수 있습니다. 테스트를 위해 'c1'과 'c2'를 키 컬럼으로 갖는 데이터 프레임을 생성합니다.
df1 = pd.DataFrame({'c1': np.arange(10),
'c2': np.arange(10,20),
'c3' : np.arange(20,30)})
df1
c1 | c2 | c3 | |
---|---|---|---|
0 | 0 | 10 | 20 |
1 | 1 | 11 | 21 |
2 | 2 | 12 | 22 |
3 | 3 | 13 | 23 |
4 | 4 | 14 | 24 |
5 | 5 | 15 | 25 |
6 | 6 | 16 | 26 |
7 | 7 | 17 | 27 |
8 | 8 | 18 | 28 |
9 | 9 | 19 | 29 |
df2 = pd.DataFrame({'c1': np.arange(10),
'c2': np.arange(15,25),
'c10' : np.arange(100,110)})
df2
c1 | c2 | c10 | |
---|---|---|---|
0 | 0 | 15 | 100 |
1 | 1 | 16 | 101 |
2 | 2 | 17 | 102 |
3 | 3 | 18 | 103 |
4 | 4 | 19 | 104 |
5 | 5 | 20 | 105 |
6 | 6 | 21 | 106 |
7 | 7 | 22 | 107 |
8 | 8 | 23 | 108 |
9 | 9 | 24 | 109 |
df1과 df2 데이터프레임은 'c1'과 'c2' 2개의 키 컬럼을 갖고 있습니다. c2 키 컬럼의 경우 2개의 데이터프레임의 로우가 서로 다른 부분이 있습니다. 따라서 'c2'를 키 컬럼으로 지정하면 값이 같은 로우만 병합을 수행합니다. 키 컬럼의 전체 로우가 동일한 'c1'을 키 컬럼을 병합에 사용해보겠습니다.
df1.merge(df2, on='c1')
c1 | c2_x | c3 | c2_y | c10 | |
---|---|---|---|---|---|
0 | 0 | 10 | 20 | 15 | 100 |
1 | 1 | 11 | 21 | 16 | 101 |
2 | 2 | 12 | 22 | 17 | 102 |
3 | 3 | 13 | 23 | 18 | 103 |
4 | 4 | 14 | 24 | 19 | 104 |
5 | 5 | 15 | 25 | 20 | 105 |
6 | 6 | 16 | 26 | 21 | 106 |
7 | 7 | 17 | 27 | 22 | 107 |
8 | 8 | 18 | 28 | 23 | 108 |
9 | 9 | 19 | 29 | 24 | 109 |
키 컬럼으로 사용한 c1은 모든 로우가 동일하기 때문에 전체 로우가 병합되어고 2 개의 데이터프레임이 모두 가지고 있는 'c2' 컬럼의은 로우가 다른 부분이 있기 때문에 각각 'c2_x'와 'c2_y'로 병합되었습니다.
df1.merge(df2, on='c1')
c1 | c2_x | c3 | c2_y | c10 | |
---|---|---|---|---|---|
0 | 0 | 10 | 20 | 15 | 100 |
1 | 1 | 11 | 21 | 16 | 101 |
2 | 2 | 12 | 22 | 17 | 102 |
3 | 3 | 13 | 23 | 18 | 103 |
4 | 4 | 14 | 24 | 19 | 104 |
5 | 5 | 15 | 25 | 20 | 105 |
6 | 6 | 16 | 26 | 21 | 106 |
7 | 7 | 17 | 27 | 22 | 107 |
8 | 8 | 18 | 28 | 23 | 108 |
9 | 9 | 19 | 29 | 24 | 109 |
데이터의 결합 방식변경¶
.merge()는 기본적으로 키 컬럼의 로우들의 교집합으로 결합하는 (inner)방식을 사용합니다. 결합 방식을 변경하려면 how 파라메터를 사용하면 됩니다. how 파라메터에서 지원하는 방식을 아래의 4가지 입니다.
- inner : 두 데이터 프레임의 동일한 키를 (교집합) 사용
- outer : 두 데이터 프레임의 모든 키를 (합진합)사용
- left : 왼쪽 데이터 프레임의 키만 사용
- right : 오른쪽 데이터 프레임의 키만 사용
'outer' 방식으로 병합을 수행하면 아래와 같이 df1과 df2의 모든 컬럼을 키로 사용하여 병합합니다.
df1.merge(df2, how='outer')
c1 | c2 | c3 | c10 | |
---|---|---|---|---|
0 | 0 | 10 | 20.0 | NaN |
1 | 1 | 11 | 21.0 | NaN |
2 | 2 | 12 | 22.0 | NaN |
3 | 3 | 13 | 23.0 | NaN |
4 | 4 | 14 | 24.0 | NaN |
5 | 5 | 15 | 25.0 | NaN |
6 | 6 | 16 | 26.0 | NaN |
7 | 7 | 17 | 27.0 | NaN |
8 | 8 | 18 | 28.0 | NaN |
9 | 9 | 19 | 29.0 | NaN |
10 | 0 | 15 | NaN | 100.0 |
11 | 1 | 16 | NaN | 101.0 |
12 | 2 | 17 | NaN | 102.0 |
13 | 3 | 18 | NaN | 103.0 |
14 | 4 | 19 | NaN | 104.0 |
15 | 5 | 20 | NaN | 105.0 |
16 | 6 | 21 | NaN | 106.0 |
17 | 7 | 22 | NaN | 107.0 |
18 | 8 | 23 | NaN | 108.0 |
19 | 9 | 24 | NaN | 109.0 |
'left' 방식을 사용하면 아래와 같이 df1의 key만 사용하여 병합합니다. left 데이터프레임에 해당하는 df1 데이터프레임에는 'c10' 컬럼이 없기 때문에 병합이 완료된 후 c10컬럼을 NaN으로 업데이트 되었습니다.
c2의 경우 df1과 df2의 키는 값지만 로우값이 다릅니다. 이 경우 left 데이터프레임인 df1의 로우값만 남은 것을 알 수 있습니다. 따라서 'outer' 방식으로 병합한 경우와 전체로우 갯수가 다른 것을 알 수 있습니다.
df1.merge(df2, how='left')
c1 | c2 | c3 | c10 | |
---|---|---|---|---|
0 | 0 | 10 | 20 | NaN |
1 | 1 | 11 | 21 | NaN |
2 | 2 | 12 | 22 | NaN |
3 | 3 | 13 | 23 | NaN |
4 | 4 | 14 | 24 | NaN |
5 | 5 | 15 | 25 | NaN |
6 | 6 | 16 | 26 | NaN |
7 | 7 | 17 | 27 | NaN |
8 | 8 | 18 | 28 | NaN |
9 | 9 | 19 | 29 | NaN |
'right' 방식을 사용하면 아래와 같이 df2의 key만 사용하여 병합합니다. left 데이터프레임에 해당하는 df2 데이터프레임에는 'c3' 컬럼이 없기 때문에 병합이 완료된 후 c3컬럼을 NaN으로 업데이트 되었습니다.
c2의 경우 df1과 df2의 키는 값지만 로우값이 다릅니다. 이 경우 right 데이터프레임인 df2의 로우값만 남은 것을 알 수 있습니다.
df1.merge(df2, how='right')
c1 | c2 | c3 | c10 | |
---|---|---|---|---|
0 | 0 | 15 | NaN | 100 |
1 | 1 | 16 | NaN | 101 |
2 | 2 | 17 | NaN | 102 |
3 | 3 | 18 | NaN | 103 |
4 | 4 | 19 | NaN | 104 |
5 | 5 | 20 | NaN | 105 |
6 | 6 | 21 | NaN | 106 |
7 | 7 | 22 | NaN | 107 |
8 | 8 | 23 | NaN | 108 |
9 | 9 | 24 | NaN | 109 |
'Programming > Pandas' 카테고리의 다른 글
[Pandas] Cleaning Data (0) | 2022.12.22 |
---|---|
[Pandas] Text파일의 데이터 읽기 (0) | 2022.12.20 |
[Pandas] 데이터접합 방향설정 및 이름설정 (0) | 2022.01.07 |
[Pandas] 데이터 연결 (concat), 인덱스 연결 (0) | 2022.01.07 |
[Pandas] 데이터 변경해서 새로운 컬럼생성 (MDD 컬럼) (0) | 2022.01.07 |