DataFrame의 합침 및 병합


1
import pandas as pd
1
df = pd.read_csv('korean-idol.csv')
1
df2 = pd.read_csv('korean-idol-2.csv')


1. DataFrame 합치기 (concat)

1-1. Row 기준 합치기 (밑으로 합침)

df_concat = pd.concat ( [ df_name1 , df_name2 ], sort = False)
df_concat .reset_index (drop = True)

  • 합칠 데이터프리임을 list로 묶어준다.
  • sort=False 옵션을 주어 column의 순서가 유지되도록 한다
  • 합친 dataframe을 새 변수에 대입한 뒤 reset_index 옵션으로 index를 초기화한다 (아님 각각 원래의 index을 가지고 있음)
  • reseet_index에서 drop=True 옵션을 사용해 원래의 행 index가 새로 index column으로 생성되지 않도록 한다

1
df.head()
이름 그룹 소속사 성별 생년월일 혈액형 브랜드평판지수
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260
1 지드래곤 빅뱅 YG 남자 1988-08-18 177.0 A 9916947
2 강다니엘 NaN 커넥트 남자 1996-12-10 180.0 A 8273745
3 방탄소년단 빅히트 남자 1995-12-30 178.0 AB 8073501
4 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928
1
df_copy = df.copy()

(1) sort 옵션

sort = False: column 순서 유지;
sort = True: column을 이름순으로 재정열

1
pd.concat([df, df_copy], sort = False)
이름 그룹 소속사 성별 생년월일 혈액형 브랜드평판지수
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260
1 지드래곤 빅뱅 YG 남자 1988-08-18 177.0 A 9916947
2 강다니엘 NaN 커넥트 남자 1996-12-10 180.0 A 8273745
3 방탄소년단 빅히트 남자 1995-12-30 178.0 AB 8073501
4 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928
5 정국 방탄소년단 빅히트 남자 1997-09-01 178.0 A 5208335
6 민현 뉴이스트 플레디스 남자 1995-08-09 182.3 O 4989792
7 소연 아이들 큐브 여자 1998-08-26 NaN B 4668615
8 방탄소년단 빅히트 남자 1992-12-04 179.2 O 4570308
9 하성운 핫샷 스타크루이엔티 남자 1994-03-22 167.1 A 4036489
10 태연 소녀시대 SM 여자 1989-03-09 NaN A 3918661
11 차은우 아스트로 판타지오 남자 1997-03-30 183.0 B 3506027
12 백호 뉴이스트 플레디스 남자 1995-07-21 175.0 AB 3301654
13 JR 뉴이스트 플레디스 남자 1995-06-08 176.0 O 3274137
14 슈가 방탄소년단 빅히트 남자 1993-03-09 174.0 O 2925442
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260
1 지드래곤 빅뱅 YG 남자 1988-08-18 177.0 A 9916947
2 강다니엘 NaN 커넥트 남자 1996-12-10 180.0 A 8273745
3 방탄소년단 빅히트 남자 1995-12-30 178.0 AB 8073501
4 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928
5 정국 방탄소년단 빅히트 남자 1997-09-01 178.0 A 5208335
6 민현 뉴이스트 플레디스 남자 1995-08-09 182.3 O 4989792
7 소연 아이들 큐브 여자 1998-08-26 NaN B 4668615
8 방탄소년단 빅히트 남자 1992-12-04 179.2 O 4570308
9 하성운 핫샷 스타크루이엔티 남자 1994-03-22 167.1 A 4036489
10 태연 소녀시대 SM 여자 1989-03-09 NaN A 3918661
11 차은우 아스트로 판타지오 남자 1997-03-30 183.0 B 3506027
12 백호 뉴이스트 플레디스 남자 1995-07-21 175.0 AB 3301654
13 JR 뉴이스트 플레디스 남자 1995-06-08 176.0 O 3274137
14 슈가 방탄소년단 빅히트 남자 1993-03-09 174.0 O 2925442
1
pd.concat([df, df_copy], sort = True)
그룹 브랜드평판지수 생년월일 성별 소속사 이름 혈액형
0 방탄소년단 10523260 1995-10-13 남자 빅히트 지민 173.6 A
1 빅뱅 9916947 1988-08-18 남자 YG 지드래곤 177.0 A
2 NaN 8273745 1996-12-10 남자 커넥트 강다니엘 180.0 A
3 방탄소년단 8073501 1995-12-30 남자 빅히트 178.0 AB
4 마마무 7650928 1995-07-23 여자 RBW 화사 162.1 A
5 방탄소년단 5208335 1997-09-01 남자 빅히트 정국 178.0 A
6 뉴이스트 4989792 1995-08-09 남자 플레디스 민현 182.3 O
7 아이들 4668615 1998-08-26 여자 큐브 소연 NaN B
8 방탄소년단 4570308 1992-12-04 남자 빅히트 179.2 O
9 핫샷 4036489 1994-03-22 남자 스타크루이엔티 하성운 167.1 A
10 소녀시대 3918661 1989-03-09 여자 SM 태연 NaN A
11 아스트로 3506027 1997-03-30 남자 판타지오 차은우 183.0 B
12 뉴이스트 3301654 1995-07-21 남자 플레디스 백호 175.0 AB
13 뉴이스트 3274137 1995-06-08 남자 플레디스 JR 176.0 O
14 방탄소년단 2925442 1993-03-09 남자 빅히트 슈가 174.0 O
0 방탄소년단 10523260 1995-10-13 남자 빅히트 지민 173.6 A
1 빅뱅 9916947 1988-08-18 남자 YG 지드래곤 177.0 A
2 NaN 8273745 1996-12-10 남자 커넥트 강다니엘 180.0 A
3 방탄소년단 8073501 1995-12-30 남자 빅히트 178.0 AB
4 마마무 7650928 1995-07-23 여자 RBW 화사 162.1 A
5 방탄소년단 5208335 1997-09-01 남자 빅히트 정국 178.0 A
6 뉴이스트 4989792 1995-08-09 남자 플레디스 민현 182.3 O
7 아이들 4668615 1998-08-26 여자 큐브 소연 NaN B
8 방탄소년단 4570308 1992-12-04 남자 빅히트 179.2 O
9 핫샷 4036489 1994-03-22 남자 스타크루이엔티 하성운 167.1 A
10 소녀시대 3918661 1989-03-09 여자 SM 태연 NaN A
11 아스트로 3506027 1997-03-30 남자 판타지오 차은우 183.0 B
12 뉴이스트 3301654 1995-07-21 남자 플레디스 백호 175.0 AB
13 뉴이스트 3274137 1995-06-08 남자 플레디스 JR 176.0 O
14 방탄소년단 2925442 1993-03-09 남자 빅히트 슈가 174.0 O

(2) reset_index 옵션

reset_index(): index가 초기화됨, 원래의 index가 새로 index column으로 저장됨
reset_index(drop = True): index가 초기화됨, 원래의 index가 새로 index column으로 생성되지 않음

1
df_concat = pd.concat([df, df_copy], sort = False)
1
df_concat.reset_index()
index 이름 그룹 소속사 성별 생년월일 혈액형 브랜드평판지수
0 0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260
1 1 지드래곤 빅뱅 YG 남자 1988-08-18 177.0 A 9916947
2 2 강다니엘 NaN 커넥트 남자 1996-12-10 180.0 A 8273745
3 3 방탄소년단 빅히트 남자 1995-12-30 178.0 AB 8073501
4 4 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928
5 5 정국 방탄소년단 빅히트 남자 1997-09-01 178.0 A 5208335
6 6 민현 뉴이스트 플레디스 남자 1995-08-09 182.3 O 4989792
7 7 소연 아이들 큐브 여자 1998-08-26 NaN B 4668615
8 8 방탄소년단 빅히트 남자 1992-12-04 179.2 O 4570308
9 9 하성운 핫샷 스타크루이엔티 남자 1994-03-22 167.1 A 4036489
10 10 태연 소녀시대 SM 여자 1989-03-09 NaN A 3918661
11 11 차은우 아스트로 판타지오 남자 1997-03-30 183.0 B 3506027
12 12 백호 뉴이스트 플레디스 남자 1995-07-21 175.0 AB 3301654
13 13 JR 뉴이스트 플레디스 남자 1995-06-08 176.0 O 3274137
14 14 슈가 방탄소년단 빅히트 남자 1993-03-09 174.0 O 2925442
15 0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260
16 1 지드래곤 빅뱅 YG 남자 1988-08-18 177.0 A 9916947
17 2 강다니엘 NaN 커넥트 남자 1996-12-10 180.0 A 8273745
18 3 방탄소년단 빅히트 남자 1995-12-30 178.0 AB 8073501
19 4 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928
20 5 정국 방탄소년단 빅히트 남자 1997-09-01 178.0 A 5208335
21 6 민현 뉴이스트 플레디스 남자 1995-08-09 182.3 O 4989792
22 7 소연 아이들 큐브 여자 1998-08-26 NaN B 4668615
23 8 방탄소년단 빅히트 남자 1992-12-04 179.2 O 4570308
24 9 하성운 핫샷 스타크루이엔티 남자 1994-03-22 167.1 A 4036489
25 10 태연 소녀시대 SM 여자 1989-03-09 NaN A 3918661
26 11 차은우 아스트로 판타지오 남자 1997-03-30 183.0 B 3506027
27 12 백호 뉴이스트 플레디스 남자 1995-07-21 175.0 AB 3301654
28 13 JR 뉴이스트 플레디스 남자 1995-06-08 176.0 O 3274137
29 14 슈가 방탄소년단 빅히트 남자 1993-03-09 174.0 O 2925442
1
df_concat.reset_index(drop = True)
이름 그룹 소속사 성별 생년월일 혈액형 브랜드평판지수
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260
1 지드래곤 빅뱅 YG 남자 1988-08-18 177.0 A 9916947
2 강다니엘 NaN 커넥트 남자 1996-12-10 180.0 A 8273745
3 방탄소년단 빅히트 남자 1995-12-30 178.0 AB 8073501
4 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928
5 정국 방탄소년단 빅히트 남자 1997-09-01 178.0 A 5208335
6 민현 뉴이스트 플레디스 남자 1995-08-09 182.3 O 4989792
7 소연 아이들 큐브 여자 1998-08-26 NaN B 4668615
8 방탄소년단 빅히트 남자 1992-12-04 179.2 O 4570308
9 하성운 핫샷 스타크루이엔티 남자 1994-03-22 167.1 A 4036489
10 태연 소녀시대 SM 여자 1989-03-09 NaN A 3918661
11 차은우 아스트로 판타지오 남자 1997-03-30 183.0 B 3506027
12 백호 뉴이스트 플레디스 남자 1995-07-21 175.0 AB 3301654
13 JR 뉴이스트 플레디스 남자 1995-06-08 176.0 O 3274137
14 슈가 방탄소년단 빅히트 남자 1993-03-09 174.0 O 2925442
15 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260
16 지드래곤 빅뱅 YG 남자 1988-08-18 177.0 A 9916947
17 강다니엘 NaN 커넥트 남자 1996-12-10 180.0 A 8273745
18 방탄소년단 빅히트 남자 1995-12-30 178.0 AB 8073501
19 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928
20 정국 방탄소년단 빅히트 남자 1997-09-01 178.0 A 5208335
21 민현 뉴이스트 플레디스 남자 1995-08-09 182.3 O 4989792
22 소연 아이들 큐브 여자 1998-08-26 NaN B 4668615
23 방탄소년단 빅히트 남자 1992-12-04 179.2 O 4570308
24 하성운 핫샷 스타크루이엔티 남자 1994-03-22 167.1 A 4036489
25 태연 소녀시대 SM 여자 1989-03-09 NaN A 3918661
26 차은우 아스트로 판타지오 남자 1997-03-30 183.0 B 3506027
27 백호 뉴이스트 플레디스 남자 1995-07-21 175.0 AB 3301654
28 JR 뉴이스트 플레디스 남자 1995-06-08 176.0 O 3274137
29 슈가 방탄소년단 빅히트 남자 1993-03-09 174.0 O 2925442


1-2. column 기준으로 합치기 (옆으로 합침)

column 기준으로 합치고자 할 때는 axis = 1 옵션을 준다:
pd.concat ( [df_name1, df_name2], axis = 1)

1
df.head()
이름 그룹 소속사 성별 생년월일 혈액형 브랜드평판지수
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260
1 지드래곤 빅뱅 YG 남자 1988-08-18 177.0 A 9916947
2 강다니엘 NaN 커넥트 남자 1996-12-10 180.0 A 8273745
3 방탄소년단 빅히트 남자 1995-12-30 178.0 AB 8073501
4 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928
1
df2 = pd.read_csv('korean-idol-2.csv')
1
df2.head()
이름 연봉 가족수
0 지민 3000 3
1 지드래곤 3500 3
2 강다니엘 3200 4
3 3050 4
4 화사 4300 3

1
pd.concat([df, df2], axis = 1)
이름 그룹 소속사 성별 생년월일 혈액형 브랜드평판지수 이름 연봉 가족수
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260 지민 3000 3
1 지드래곤 빅뱅 YG 남자 1988-08-18 177.0 A 9916947 지드래곤 3500 3
2 강다니엘 NaN 커넥트 남자 1996-12-10 180.0 A 8273745 강다니엘 3200 4
3 방탄소년단 빅히트 남자 1995-12-30 178.0 AB 8073501 3050 4
4 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928 화사 4300 3
5 정국 방탄소년단 빅히트 남자 1997-09-01 178.0 A 5208335 정국 2900 5
6 민현 뉴이스트 플레디스 남자 1995-08-09 182.3 O 4989792 민현 3400 6
7 소연 아이들 큐브 여자 1998-08-26 NaN B 4668615 소연 4500 5
8 방탄소년단 빅히트 남자 1992-12-04 179.2 O 4570308 4200 4
9 하성운 핫샷 스타크루이엔티 남자 1994-03-22 167.1 A 4036489 하성운 4300 4
10 태연 소녀시대 SM 여자 1989-03-09 NaN A 3918661 태연 3700 3
11 차은우 아스트로 판타지오 남자 1997-03-30 183.0 B 3506027 차은우 3850 5
12 백호 뉴이스트 플레디스 남자 1995-07-21 175.0 AB 3301654 백호 3900 4
13 JR 뉴이스트 플레디스 남자 1995-06-08 176.0 O 3274137 JR 4100 3
14 슈가 방탄소년단 빅히트 남자 1993-03-09 174.0 O 2925442 슈가 4150 3

행의 갯수가 맞지 않을 시

  • 두 DataFrame이 행 index기준으로 합치게 됨
  • 행 갯수가 적은 DataFrame의 빈칸에는 NaN로 채워지게 됨
1
2
df3 = df2.drop([3,5])
df3
이름 연봉 가족수
0 지민 3000 3
1 지드래곤 3500 3
2 강다니엘 3200 4
4 화사 4300 3
6 민현 3400 6
7 소연 4500 5
8 4200 4
9 하성운 4300 4
10 태연 3700 3
11 차은우 3850 5
12 백호 3900 4
13 JR 4100 3
14 슈가 4150 3
1
pd.concat([df, df3], axis = 1)
이름 그룹 소속사 성별 생년월일 혈액형 브랜드평판지수 이름 연봉 가족수
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260 지민 3000.0 3.0
1 지드래곤 빅뱅 YG 남자 1988-08-18 177.0 A 9916947 지드래곤 3500.0 3.0
2 강다니엘 NaN 커넥트 남자 1996-12-10 180.0 A 8273745 강다니엘 3200.0 4.0
3 방탄소년단 빅히트 남자 1995-12-30 178.0 AB 8073501 NaN NaN NaN
4 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928 화사 4300.0 3.0
5 정국 방탄소년단 빅히트 남자 1997-09-01 178.0 A 5208335 NaN NaN NaN
6 민현 뉴이스트 플레디스 남자 1995-08-09 182.3 O 4989792 민현 3400.0 6.0
7 소연 아이들 큐브 여자 1998-08-26 NaN B 4668615 소연 4500.0 5.0
8 방탄소년단 빅히트 남자 1992-12-04 179.2 O 4570308 4200.0 4.0
9 하성운 핫샷 스타크루이엔티 남자 1994-03-22 167.1 A 4036489 하성운 4300.0 4.0
10 태연 소녀시대 SM 여자 1989-03-09 NaN A 3918661 태연 3700.0 3.0
11 차은우 아스트로 판타지오 남자 1997-03-30 183.0 B 3506027 차은우 3850.0 5.0
12 백호 뉴이스트 플레디스 남자 1995-07-21 175.0 AB 3301654 백호 3900.0 4.0
13 JR 뉴이스트 플레디스 남자 1995-06-08 176.0 O 3274137 JR 4100.0 3.0
14 슈가 방탄소년단 빅히트 남자 1993-03-09 174.0 O 2925442 슈가 4150.0 3.0

1
2
df4 = df2.drop([13, 14])
pd.concat([df,df4], axis = 1)
이름 그룹 소속사 성별 생년월일 혈액형 브랜드평판지수 이름 연봉 가족수
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260 지민 3000.0 3.0
1 지드래곤 빅뱅 YG 남자 1988-08-18 177.0 A 9916947 지드래곤 3500.0 3.0
2 강다니엘 NaN 커넥트 남자 1996-12-10 180.0 A 8273745 강다니엘 3200.0 4.0
3 방탄소년단 빅히트 남자 1995-12-30 178.0 AB 8073501 3050.0 4.0
4 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928 화사 4300.0 3.0
5 정국 방탄소년단 빅히트 남자 1997-09-01 178.0 A 5208335 정국 2900.0 5.0
6 민현 뉴이스트 플레디스 남자 1995-08-09 182.3 O 4989792 민현 3400.0 6.0
7 소연 아이들 큐브 여자 1998-08-26 NaN B 4668615 소연 4500.0 5.0
8 방탄소년단 빅히트 남자 1992-12-04 179.2 O 4570308 4200.0 4.0
9 하성운 핫샷 스타크루이엔티 남자 1994-03-22 167.1 A 4036489 하성운 4300.0 4.0
10 태연 소녀시대 SM 여자 1989-03-09 NaN A 3918661 태연 3700.0 3.0
11 차은우 아스트로 판타지오 남자 1997-03-30 183.0 B 3506027 차은우 3850.0 5.0
12 백호 뉴이스트 플레디스 남자 1995-07-21 175.0 AB 3301654 백호 3900.0 4.0
13 JR 뉴이스트 플레디스 남자 1995-06-08 176.0 O 3274137 NaN NaN NaN
14 슈가 방탄소년단 빅히트 남자 1993-03-09 174.0 O 2925442 NaN NaN NaN


2. DataFrame 병합하기 (merge)

concat과 merge의 차이:

  • concat: row 나 column 기준으로 단순하게 이어 붙히기
  • merge: 특정 고유한 키(unique id) 값을 기준으로 병합하기

1
df.head()
이름 그룹 소속사 성별 생년월일 혈액형 브랜드평판지수
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260
1 지드래곤 빅뱅 YG 남자 1988-08-18 177.0 A 9916947
2 강다니엘 NaN 커넥트 남자 1996-12-10 180.0 A 8273745
3 방탄소년단 빅히트 남자 1995-12-30 178.0 AB 8073501
4 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928
1
df2.head()
이름 연봉 가족수
0 지민 3000 3
1 지드래곤 3500 3
2 강다니엘 3200 4
3 3050 4
4 화사 4300 3

df와 df2는 "이름"이라는 column이 겹친다
따라서, 우리는 "이름"을 기준으로 두 DataFrame을 병합할 수 있다

pd.merge (left_df, right_df, on = “기준 column”, how = “…” )

  • left_df와 right_df 에는 병합할 두 DataFrame을 대입한다
  • on 에는 병합의 기준이 되는 column을 넣어 준다
  • how 에는 ‘left’, ‘right’, ‘inner’, 'outer’라는 4가지의 병합 방식중 한가지를 택한다

2-0. 예제 데이터 만들기

1
df_right = df2.drop([1,3,5,7])
1
df_right
이름 연봉 가족수
0 지민 3000 3
2 강다니엘 3200 4
4 화사 4300 3
6 민현 3400 6
8 4200 4
9 하성운 4300 4
10 태연 3700 3
11 차은우 3850 5
12 백호 3900 4
13 JR 4100 3
14 슈가 4150 3
1
2
df_right = df_right.reset_index(drop = True)
df_right
이름 연봉 가족수
0 지민 3000 3
1 강다니엘 3200 4
2 화사 4300 3
3 민현 3400 6
4 4200 4
5 하성운 4300 4
6 태연 3700 3
7 차은우 3850 5
8 백호 3900 4
9 JR 4100 3
10 슈가 4150 3
1
df
이름 그룹 소속사 성별 생년월일 혈액형 브랜드평판지수
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260
1 지드래곤 빅뱅 YG 남자 1988-08-18 177.0 A 9916947
2 강다니엘 NaN 커넥트 남자 1996-12-10 180.0 A 8273745
3 방탄소년단 빅히트 남자 1995-12-30 178.0 AB 8073501
4 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928
5 정국 방탄소년단 빅히트 남자 1997-09-01 178.0 A 5208335
6 민현 뉴이스트 플레디스 남자 1995-08-09 182.3 O 4989792
7 소연 아이들 큐브 여자 1998-08-26 NaN B 4668615
8 방탄소년단 빅히트 남자 1992-12-04 179.2 O 4570308
9 하성운 핫샷 스타크루이엔티 남자 1994-03-22 167.1 A 4036489
10 태연 소녀시대 SM 여자 1989-03-09 NaN A 3918661
11 차은우 아스트로 판타지오 남자 1997-03-30 183.0 B 3506027
12 백호 뉴이스트 플레디스 남자 1995-07-21 175.0 AB 3301654
13 JR 뉴이스트 플레디스 남자 1995-06-08 176.0 O 3274137
14 슈가 방탄소년단 빅히트 남자 1993-03-09 174.0 O 2925442

concat로 합치는 경우:
데이터가 행 index기준으로 합치게 되기 때문에 이름이 다른 시람의 데이터가 합치게 된다

1
pd.concat([df, df_right], axis = 1)
이름 그룹 소속사 성별 생년월일 혈액형 브랜드평판지수 이름 연봉 가족수
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260 지민 3000.0 3.0
1 지드래곤 빅뱅 YG 남자 1988-08-18 177.0 A 9916947 강다니엘 3200.0 4.0
2 강다니엘 NaN 커넥트 남자 1996-12-10 180.0 A 8273745 화사 4300.0 3.0
3 방탄소년단 빅히트 남자 1995-12-30 178.0 AB 8073501 민현 3400.0 6.0
4 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928 4200.0 4.0
5 정국 방탄소년단 빅히트 남자 1997-09-01 178.0 A 5208335 하성운 4300.0 4.0
6 민현 뉴이스트 플레디스 남자 1995-08-09 182.3 O 4989792 태연 3700.0 3.0
7 소연 아이들 큐브 여자 1998-08-26 NaN B 4668615 차은우 3850.0 5.0
8 방탄소년단 빅히트 남자 1992-12-04 179.2 O 4570308 백호 3900.0 4.0
9 하성운 핫샷 스타크루이엔티 남자 1994-03-22 167.1 A 4036489 JR 4100.0 3.0
10 태연 소녀시대 SM 여자 1989-03-09 NaN A 3918661 슈가 4150.0 3.0
11 차은우 아스트로 판타지오 남자 1997-03-30 183.0 B 3506027 NaN NaN NaN
12 백호 뉴이스트 플레디스 남자 1995-07-21 175.0 AB 3301654 NaN NaN NaN
13 JR 뉴이스트 플레디스 남자 1995-06-08 176.0 O 3274137 NaN NaN NaN
14 슈가 방탄소년단 빅히트 남자 1993-03-09 174.0 O 2925442 NaN NaN NaN

따리서, 우리는 merge를 사용하여 두 DataFrame를 “이름” 기준으로 병합한다


2-1. left, right 방식

  • "left"옵션을 부여할 때: left DataFrame에 키 값이 존재하면 해당 데이터를 유지하고, 병합한 right DataFrame의 값은 NaN이 대입 됨
  • 반대로, "right"옵션을 부여할 때 right DataFrame을 기준으로 병합하게 됨

1
df
이름 그룹 소속사 성별 생년월일 혈액형 브랜드평판지수
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260
1 지드래곤 빅뱅 YG 남자 1988-08-18 177.0 A 9916947
2 강다니엘 NaN 커넥트 남자 1996-12-10 180.0 A 8273745
3 방탄소년단 빅히트 남자 1995-12-30 178.0 AB 8073501
4 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928
5 정국 방탄소년단 빅히트 남자 1997-09-01 178.0 A 5208335
6 민현 뉴이스트 플레디스 남자 1995-08-09 182.3 O 4989792
7 소연 아이들 큐브 여자 1998-08-26 NaN B 4668615
8 방탄소년단 빅히트 남자 1992-12-04 179.2 O 4570308
9 하성운 핫샷 스타크루이엔티 남자 1994-03-22 167.1 A 4036489
10 태연 소녀시대 SM 여자 1989-03-09 NaN A 3918661
11 차은우 아스트로 판타지오 남자 1997-03-30 183.0 B 3506027
12 백호 뉴이스트 플레디스 남자 1995-07-21 175.0 AB 3301654
13 JR 뉴이스트 플레디스 남자 1995-06-08 176.0 O 3274137
14 슈가 방탄소년단 빅히트 남자 1993-03-09 174.0 O 2925442
1
df_right
이름 연봉 가족수
0 지민 3000 3
1 강다니엘 3200 4
2 화사 4300 3
3 민현 3400 6
4 4200 4
5 하성운 4300 4
6 태연 3700 3
7 차은우 3850 5
8 백호 3900 4
9 JR 4100 3
10 슈가 4150 3

1
pd.merge(df, df_right, on = "이름", how = "left")
이름 그룹 소속사 성별 생년월일 혈액형 브랜드평판지수 연봉 가족수
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260 3000.0 3.0
1 지드래곤 빅뱅 YG 남자 1988-08-18 177.0 A 9916947 NaN NaN
2 강다니엘 NaN 커넥트 남자 1996-12-10 180.0 A 8273745 3200.0 4.0
3 방탄소년단 빅히트 남자 1995-12-30 178.0 AB 8073501 NaN NaN
4 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928 4300.0 3.0
5 정국 방탄소년단 빅히트 남자 1997-09-01 178.0 A 5208335 NaN NaN
6 민현 뉴이스트 플레디스 남자 1995-08-09 182.3 O 4989792 3400.0 6.0
7 소연 아이들 큐브 여자 1998-08-26 NaN B 4668615 NaN NaN
8 방탄소년단 빅히트 남자 1992-12-04 179.2 O 4570308 4200.0 4.0
9 하성운 핫샷 스타크루이엔티 남자 1994-03-22 167.1 A 4036489 4300.0 4.0
10 태연 소녀시대 SM 여자 1989-03-09 NaN A 3918661 3700.0 3.0
11 차은우 아스트로 판타지오 남자 1997-03-30 183.0 B 3506027 3850.0 5.0
12 백호 뉴이스트 플레디스 남자 1995-07-21 175.0 AB 3301654 3900.0 4.0
13 JR 뉴이스트 플레디스 남자 1995-06-08 176.0 O 3274137 4100.0 3.0
14 슈가 방탄소년단 빅히트 남자 1993-03-09 174.0 O 2925442 4150.0 3.0
1
pd.merge(df, df_right, on = "이름", how = "right")
이름 그룹 소속사 성별 생년월일 혈액형 브랜드평판지수 연봉 가족수
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260 3000 3
1 강다니엘 NaN 커넥트 남자 1996-12-10 180.0 A 8273745 3200 4
2 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928 4300 3
3 민현 뉴이스트 플레디스 남자 1995-08-09 182.3 O 4989792 3400 6
4 방탄소년단 빅히트 남자 1992-12-04 179.2 O 4570308 4200 4
5 하성운 핫샷 스타크루이엔티 남자 1994-03-22 167.1 A 4036489 4300 4
6 태연 소녀시대 SM 여자 1989-03-09 NaN A 3918661 3700 3
7 차은우 아스트로 판타지오 남자 1997-03-30 183.0 B 3506027 3850 5
8 백호 뉴이스트 플레디스 남자 1995-07-21 175.0 AB 3301654 3900 4
9 JR 뉴이스트 플레디스 남자 1995-06-08 176.0 O 3274137 4100 3
10 슈가 방탄소년단 빅히트 남자 1993-03-09 174.0 O 2925442 4150 3

현재, left DataFrame이 더 많은 데이터를 보유하고 있으니, right를 기준으로 병합하면 DataFrame 사이즈가 줄어드게 된다


2-2. inner, outer 방식

  • inner 방식은 두 DataFrame에 모두 키 값이 존재하는 경우만 병합한다 (교집합과 비슷)
  • outer 방식은 하나의 DataFrame에만 키 값이 존재하더라도 모두 병합한다 (합집합과 비슷)
  • outer 방식에서는 없는 값은 NaN으로 대입된다

1
df
이름 그룹 소속사 성별 생년월일 혈액형 브랜드평판지수
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260
1 지드래곤 빅뱅 YG 남자 1988-08-18 177.0 A 9916947
2 강다니엘 NaN 커넥트 남자 1996-12-10 180.0 A 8273745
3 방탄소년단 빅히트 남자 1995-12-30 178.0 AB 8073501
4 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928
5 정국 방탄소년단 빅히트 남자 1997-09-01 178.0 A 5208335
6 민현 뉴이스트 플레디스 남자 1995-08-09 182.3 O 4989792
7 소연 아이들 큐브 여자 1998-08-26 NaN B 4668615
8 방탄소년단 빅히트 남자 1992-12-04 179.2 O 4570308
9 하성운 핫샷 스타크루이엔티 남자 1994-03-22 167.1 A 4036489
10 태연 소녀시대 SM 여자 1989-03-09 NaN A 3918661
11 차은우 아스트로 판타지오 남자 1997-03-30 183.0 B 3506027
12 백호 뉴이스트 플레디스 남자 1995-07-21 175.0 AB 3301654
13 JR 뉴이스트 플레디스 남자 1995-06-08 176.0 O 3274137
14 슈가 방탄소년단 빅히트 남자 1993-03-09 174.0 O 2925442
1
df_right
이름 연봉 가족수
0 지민 3000 3
1 강다니엘 3200 4
2 화사 4300 3
3 민현 3400 6
4 4200 4
5 하성운 4300 4
6 태연 3700 3
7 차은우 3850 5
8 백호 3900 4
9 JR 4100 3
10 슈가 4150 3

1
pd.merge(df, df_right, on = "이름", how = 'inner')
이름 그룹 소속사 성별 생년월일 혈액형 브랜드평판지수 연봉 가족수
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260 3000 3
1 강다니엘 NaN 커넥트 남자 1996-12-10 180.0 A 8273745 3200 4
2 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928 4300 3
3 민현 뉴이스트 플레디스 남자 1995-08-09 182.3 O 4989792 3400 6
4 방탄소년단 빅히트 남자 1992-12-04 179.2 O 4570308 4200 4
5 하성운 핫샷 스타크루이엔티 남자 1994-03-22 167.1 A 4036489 4300 4
6 태연 소녀시대 SM 여자 1989-03-09 NaN A 3918661 3700 3
7 차은우 아스트로 판타지오 남자 1997-03-30 183.0 B 3506027 3850 5
8 백호 뉴이스트 플레디스 남자 1995-07-21 175.0 AB 3301654 3900 4
9 JR 뉴이스트 플레디스 남자 1995-06-08 176.0 O 3274137 4100 3
10 슈가 방탄소년단 빅히트 남자 1993-03-09 174.0 O 2925442 4150 3
1
pd.merge(df, df_right, on = "이름", how = 'outer')
이름 그룹 소속사 성별 생년월일 혈액형 브랜드평판지수 연봉 가족수
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260 3000.0 3.0
1 지드래곤 빅뱅 YG 남자 1988-08-18 177.0 A 9916947 NaN NaN
2 강다니엘 NaN 커넥트 남자 1996-12-10 180.0 A 8273745 3200.0 4.0
3 방탄소년단 빅히트 남자 1995-12-30 178.0 AB 8073501 NaN NaN
4 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928 4300.0 3.0
5 정국 방탄소년단 빅히트 남자 1997-09-01 178.0 A 5208335 NaN NaN
6 민현 뉴이스트 플레디스 남자 1995-08-09 182.3 O 4989792 3400.0 6.0
7 소연 아이들 큐브 여자 1998-08-26 NaN B 4668615 NaN NaN
8 방탄소년단 빅히트 남자 1992-12-04 179.2 O 4570308 4200.0 4.0
9 하성운 핫샷 스타크루이엔티 남자 1994-03-22 167.1 A 4036489 4300.0 4.0
10 태연 소녀시대 SM 여자 1989-03-09 NaN A 3918661 3700.0 3.0
11 차은우 아스트로 판타지오 남자 1997-03-30 183.0 B 3506027 3850.0 5.0
12 백호 뉴이스트 플레디스 남자 1995-07-21 175.0 AB 3301654 3900.0 4.0
13 JR 뉴이스트 플레디스 남자 1995-06-08 176.0 O 3274137 4100.0 3.0
14 슈가 방탄소년단 빅히트 남자 1993-03-09 174.0 O 2925442 4150.0 3.0

2-3. column명은 다르지만, 동일한 성질의 데이터 인 경우?

pd.merge ( left_df, right_df, left_on = “left_col”, right_on = “right_col, how = “…” )


1
df.head()
이름 그룹 소속사 성별 생년월일 혈액형 브랜드평판지수
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260
1 지드래곤 빅뱅 YG 남자 1988-08-18 177.0 A 9916947
2 강다니엘 NaN 커넥트 남자 1996-12-10 180.0 A 8273745
3 방탄소년단 빅히트 남자 1995-12-30 178.0 AB 8073501
4 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928
1
df_right.head()
이름 연봉 가족수
0 지민 3000 3
1 강다니엘 3200 4
2 화사 4300 3
3 민현 3400 6
4 4200 4
1
df_right.columns = ["성함", "연봉", "기족수"]
1
df_right.head()
성함 연봉 기족수
0 지민 3000 3
1 강다니엘 3200 4
2 화사 4300 3
3 민현 3400 6
4 4200 4

df의 "이름"과 df_right의 "성함"은 column name이 다르지만, 동일한 성질의 데이터다.
이럴 때는 left_on, right_on 옵션을 사용해 기준 column을 지정한다

1
pd.merge(df, df_right, left_on = "이름", right_on = "성함", how = "outer")
이름 그룹 소속사 성별 생년월일 혈액형 브랜드평판지수 성함 연봉 기족수
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260 지민 3000.0 3.0
1 지드래곤 빅뱅 YG 남자 1988-08-18 177.0 A 9916947 NaN NaN NaN
2 강다니엘 NaN 커넥트 남자 1996-12-10 180.0 A 8273745 강다니엘 3200.0 4.0
3 방탄소년단 빅히트 남자 1995-12-30 178.0 AB 8073501 NaN NaN NaN
4 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928 화사 4300.0 3.0
5 정국 방탄소년단 빅히트 남자 1997-09-01 178.0 A 5208335 NaN NaN NaN
6 민현 뉴이스트 플레디스 남자 1995-08-09 182.3 O 4989792 민현 3400.0 6.0
7 소연 아이들 큐브 여자 1998-08-26 NaN B 4668615 NaN NaN NaN
8 방탄소년단 빅히트 남자 1992-12-04 179.2 O 4570308 4200.0 4.0
9 하성운 핫샷 스타크루이엔티 남자 1994-03-22 167.1 A 4036489 하성운 4300.0 4.0
10 태연 소녀시대 SM 여자 1989-03-09 NaN A 3918661 태연 3700.0 3.0
11 차은우 아스트로 판타지오 남자 1997-03-30 183.0 B 3506027 차은우 3850.0 5.0
12 백호 뉴이스트 플레디스 남자 1995-07-21 175.0 AB 3301654 백호 3900.0 4.0
13 JR 뉴이스트 플레디스 남자 1995-06-08 176.0 O 3274137 JR 4100.0 3.0
14 슈가 방탄소년단 빅히트 남자 1993-03-09 174.0 O 2925442 슈가 4150.0 3.0