[사전학습] 2.3 데이터 합치기
DataFrame Merge
1
import pandas as pd
Inner Join
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
data1 = {
'학번' : [1, 2, 3, 4],
'이름' : ['아이유', '김연아', '홍길동', '강감찬'],
'학과' : ['철학', '경영학', '컴퓨터', '물리학']
}
data2 = {
'학번' : [1, 2, 4, 5],
'학년' : [2, 4, 3, 1],
'학점' : [1.5, 2.0, 4.1, 3.8]
}
df1 = pd.DataFrame(data1)
df2 = pd.DataFrame(data2)
display(df1)
display(df2)
학번 | 이름 | 학과 | |
---|---|---|---|
0 | 1 | 아이유 | 철학 |
1 | 2 | 김연아 | 경영학 |
2 | 3 | 홍길동 | 컴퓨터 |
3 | 4 | 강감찬 | 물리학 |
학번 | 학년 | 학점 | |
---|---|---|---|
0 | 1 | 2 | 1.5 |
1 | 2 | 4 | 2.0 |
2 | 4 | 3 | 4.1 |
3 | 5 | 1 | 3.8 |
1
2
# inner join -- 일치되는 것만 merge
inner_df = pd.merge(df1, df2, on='학번', how='inner')
1
display(inner_df)
학번 | 이름 | 학과 | 학년 | 학점 | |
---|---|---|---|---|---|
0 | 1 | 아이유 | 철학 | 2 | 1.5 |
1 | 2 | 김연아 | 경영학 | 4 | 2.0 |
2 | 4 | 강감찬 | 물리학 | 3 | 4.1 |
Outer Join
1
2
3
# outer join
outer_df = pd.merge(df1, df2, on='학번', how='outer')
outer_df
학번 | 이름 | 학과 | 학년 | 학점 | |
---|---|---|---|---|---|
0 | 1 | 아이유 | 철학 | 2.0 | 1.5 |
1 | 2 | 김연아 | 경영학 | 4.0 | 2.0 |
2 | 3 | 홍길동 | 컴퓨터 | NaN | NaN |
3 | 4 | 강감찬 | 물리학 | 3.0 | 4.1 |
4 | 5 | NaN | NaN | 1.0 | 3.8 |
Left and Right Join
1
2
left_df = pd.merge(df1, df2, on='학번', how='left')
left_df
학번 | 이름 | 학과 | 학년 | 학점 | |
---|---|---|---|---|---|
0 | 1 | 아이유 | 철학 | 2.0 | 1.5 |
1 | 2 | 김연아 | 경영학 | 4.0 | 2.0 |
2 | 3 | 홍길동 | 컴퓨터 | NaN | NaN |
3 | 4 | 강감찬 | 물리학 | 3.0 | 4.1 |
1
2
right_df = pd.merge(df1, df2, on='학번', how='right')
right_df
학번 | 이름 | 학과 | 학년 | 학점 | |
---|---|---|---|---|---|
0 | 1 | 아이유 | 철학 | 2 | 1.5 |
1 | 2 | 김연아 | 경영학 | 4 | 2.0 |
2 | 4 | 강감찬 | 물리학 | 3 | 4.1 |
3 | 5 | NaN | NaN | 1 | 3.8 |
Merge 응용 : 현실 데이터를 다룰 때 생길만 한 경우
1) 같은 의미의 다른 컬럼 명을 병합할 때
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# case 1 : 같은 의미 다른 컬럼명 --> 학번 vs 학생고유번호
data1 = {
'학번' : [1, 2, 3, 4],
'이름' : ['아이유', '김연아', '홍길동', '강감찬'],
'학과' : ['철학', '경영학', '컴퓨터', '물리학']
}
data2 = {
'학생고유번호' : [1, 2, 4, 5],
'학년' : [2, 4, 3, 1],
'학점' : [1.5, 2.0, 4.1, 3.8]
}
df1 = pd.DataFrame(data1)
df2 = pd.DataFrame(data2)
1
2
merged_df = pd.merge(df1, df2, left_on='학번', right_on='학생고유번호', how='inner')
merged_df
학번 | 이름 | 학과 | 학생고유번호 | 학년 | 학점 | |
---|---|---|---|---|---|---|
0 | 1 | 아이유 | 철학 | 1 | 2 | 1.5 |
1 | 2 | 김연아 | 경영학 | 2 | 4 | 2.0 |
2 | 4 | 강감찬 | 물리학 | 4 | 3 | 4.1 |
1
merged_df.drop('학생고유번호', axis=1)
학번 | 이름 | 학과 | 학년 | 학점 | |
---|---|---|---|---|---|
0 | 1 | 아이유 | 철학 | 2 | 1.5 |
1 | 2 | 김연아 | 경영학 | 4 | 2.0 |
2 | 4 | 강감찬 | 물리학 | 3 | 4.1 |
2) 공유하는 컬럼이 없는 경우
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
data1 = {
'학번' : [1, 2, 3, 4],
'이름' : ['아이유', '김연아', '홍길동', '강감찬'],
'학과' : ['철학', '경영학', '컴퓨터', '물리학']
}
data2 = {
'학년' : [2, 4, 3, 1],
'학점' : [1.5, 2.0, 4.1, 3.8]
}
df1 = pd.DataFrame(data1)
df2 = pd.DataFrame(data2, index=[1, 2, 4, 5])
display(df1)
display(df2)
학번 | 이름 | 학과 | |
---|---|---|---|
0 | 1 | 아이유 | 철학 |
1 | 2 | 김연아 | 경영학 |
2 | 3 | 홍길동 | 컴퓨터 |
3 | 4 | 강감찬 | 물리학 |
학년 | 학점 | |
---|---|---|
1 | 2 | 1.5 |
2 | 4 | 2.0 |
4 | 3 | 4.1 |
5 | 1 | 3.8 |
1
2
merged_df1 = pd.merge(df1, df2, left_index=True, right_index=True, how='inner')
display(merged_df1)
학번 | 이름 | 학과 | 학년 | 학점 | |
---|---|---|---|---|---|
1 | 2 | 김연아 | 경영학 | 2 | 1.5 |
2 | 3 | 홍길동 | 컴퓨터 | 4 | 2.0 |
1
2
merged_df2 = pd.merge(df1, df2, left_on='학번', right_index=True, how='inner')
display(merged_df2)
학번 | 이름 | 학과 | 학년 | 학점 | |
---|---|---|---|---|---|
0 | 1 | 아이유 | 철학 | 2 | 1.5 |
1 | 2 | 김연아 | 경영학 | 4 | 2.0 |
3 | 4 | 강감찬 | 물리학 | 3 | 4.1 |
1
df1.join(df2, how='inner') # 양 쪽 데이터프레임의 인덱스를 기준으로 병합
학번 | 이름 | 학과 | 학년 | 학점 | |
---|---|---|---|---|---|
1 | 2 | 김연아 | 경영학 | 2 | 1.5 |
2 | 3 | 홍길동 | 컴퓨터 | 4 | 2.0 |
데이터 연결 pandas.concat
1
2
3
4
import numpy as np
import pandas as pd
np.random.seed(1)
1
2
3
4
df1 = pd.DataFrame(np.random.randint(0, 9, (3, 2)), # 3x2 매트릭스
index=['a', 'b', 'c'],
columns=['one', 'two'])
df1
one | two | |
---|---|---|
a | 5 | 8 |
b | 5 | 0 |
c | 0 | 1 |
1
2
3
4
df2 = pd.DataFrame(np.random.randint(0, 9, (2, 2)), # 2x2 매트릭스
index=['a', 'b'],
columns=['three', 'four'])
df2
three | four | |
---|---|---|
a | 7 | 6 |
b | 2 | 4 |
1
2
result_df = pd.concat([df1, df2], axis=1)
result_df
one | two | three | four | |
---|---|---|---|---|
a | 5 | 8 | 7.0 | 6.0 |
b | 5 | 0 | 2.0 | 4.0 |
c | 0 | 1 | NaN | NaN |
1
2
result_df2 = pd.concat([df1, df2], axis=0)
result_df2
one | two | three | four | |
---|---|---|---|---|
a | 5.0 | 8.0 | NaN | NaN |
b | 5.0 | 0.0 | NaN | NaN |
c | 0.0 | 1.0 | NaN | NaN |
a | NaN | NaN | 7.0 | 6.0 |
b | NaN | NaN | 2.0 | 4.0 |
1
2
merged_df = pd.merge(df1, df2, left_index=True, right_index=True, how='outer')
merged_df
one | two | three | four | |
---|---|---|---|---|
a | 5 | 8 | 7.0 | 6.0 |
b | 5 | 0 | 2.0 | 4.0 |
c | 0 | 1 | NaN | NaN |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
data1 = {
'학번' : [1, 2, 3, 4],
'이름' : ['아이유', '김연아', '홍길동', '강감찬'],
'학과' : ['철학', '경영학', '컴퓨터', '물리학']
}
data2 = {
'학번' : [5, 6, 7, 8],
'이름' : ['김범수', '이을용', '이순신', '김한국'],
'학과' : ['경제학', '국문학', '경영학', '경영학']
}
df1 = pd.DataFrame(data1)
df2 = pd.DataFrame(data2)
display(df1)
display(df2)
학번 | 이름 | 학과 | |
---|---|---|---|
0 | 1 | 아이유 | 철학 |
1 | 2 | 김연아 | 경영학 |
2 | 3 | 홍길동 | 컴퓨터 |
3 | 4 | 강감찬 | 물리학 |
학번 | 이름 | 학과 | |
---|---|---|---|
0 | 5 | 김범수 | 경제학 |
1 | 6 | 이을용 | 국문학 |
2 | 7 | 이순신 | 경영학 |
3 | 8 | 김한국 | 경영학 |
1
2
concat_df = pd.concat([df1, df2], axis=0)
concat_df
학번 | 이름 | 학과 | |
---|---|---|---|
0 | 1 | 아이유 | 철학 |
1 | 2 | 김연아 | 경영학 |
2 | 3 | 홍길동 | 컴퓨터 |
3 | 4 | 강감찬 | 물리학 |
0 | 5 | 김범수 | 경제학 |
1 | 6 | 이을용 | 국문학 |
2 | 7 | 이순신 | 경영학 |
3 | 8 | 김한국 | 경영학 |
1
2
concat_df.reset_index(drop=True, inplace=True)
concat_df
학번 | 이름 | 학과 | |
---|---|---|---|
0 | 1 | 아이유 | 철학 |
1 | 2 | 김연아 | 경영학 |
2 | 3 | 홍길동 | 컴퓨터 |
3 | 4 | 강감찬 | 물리학 |
4 | 5 | 김범수 | 경제학 |
5 | 6 | 이을용 | 국문학 |
6 | 7 | 이순신 | 경영학 |
7 | 8 | 김한국 | 경영학 |
1
This post is licensed under CC BY 4.0 by the author.