Post

[사전학습] 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)
학번이름학과
01아이유철학
12김연아경영학
23홍길동컴퓨터
34강감찬물리학
학번학년학점
0121.5
1242.0
2434.1
3513.8
1
2
# inner join -- 일치되는 것만 merge
inner_df = pd.merge(df1, df2, on='학번', how='inner')
1
display(inner_df)
학번이름학과학년학점
01아이유철학21.5
12김연아경영학42.0
24강감찬물리학34.1

Outer Join

1
2
3
# outer join
outer_df = pd.merge(df1, df2, on='학번', how='outer')
outer_df
학번이름학과학년학점
01아이유철학2.01.5
12김연아경영학4.02.0
23홍길동컴퓨터NaNNaN
34강감찬물리학3.04.1
45NaNNaN1.03.8

Left and Right Join

1
2
left_df = pd.merge(df1, df2, on='학번', how='left')
left_df
학번이름학과학년학점
01아이유철학2.01.5
12김연아경영학4.02.0
23홍길동컴퓨터NaNNaN
34강감찬물리학3.04.1
1
2
right_df = pd.merge(df1, df2, on='학번', how='right')
right_df
학번이름학과학년학점
01아이유철학21.5
12김연아경영학42.0
24강감찬물리학34.1
35NaNNaN13.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
학번이름학과학생고유번호학년학점
01아이유철학121.5
12김연아경영학242.0
24강감찬물리학434.1
1
merged_df.drop('학생고유번호', axis=1)
학번이름학과학년학점
01아이유철학21.5
12김연아경영학42.0
24강감찬물리학34.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)
학번이름학과
01아이유철학
12김연아경영학
23홍길동컴퓨터
34강감찬물리학
학년학점
121.5
242.0
434.1
513.8
1
2
merged_df1 = pd.merge(df1, df2, left_index=True, right_index=True, how='inner')
display(merged_df1)
학번이름학과학년학점
12김연아경영학21.5
23홍길동컴퓨터42.0
1
2
merged_df2 = pd.merge(df1, df2, left_on='학번', right_index=True, how='inner')
display(merged_df2)
학번이름학과학년학점
01아이유철학21.5
12김연아경영학42.0
34강감찬물리학34.1
1
df1.join(df2, how='inner') # 양 쪽 데이터프레임의 인덱스를 기준으로 병합
학번이름학과학년학점
12김연아경영학21.5
23홍길동컴퓨터42.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
onetwo
a58
b50
c01
1
2
3
4
df2 = pd.DataFrame(np.random.randint(0, 9, (2, 2)), # 2x2 매트릭스
                  index=['a', 'b'],
                  columns=['three', 'four'])
df2
threefour
a76
b24
1
2
result_df = pd.concat([df1, df2], axis=1)
result_df
onetwothreefour
a587.06.0
b502.04.0
c01NaNNaN
1
2
result_df2 = pd.concat([df1, df2], axis=0)
result_df2
onetwothreefour
a5.08.0NaNNaN
b5.00.0NaNNaN
c0.01.0NaNNaN
aNaNNaN7.06.0
bNaNNaN2.04.0
1
2
merged_df = pd.merge(df1, df2, left_index=True, right_index=True, how='outer')
merged_df
onetwothreefour
a587.06.0
b502.04.0
c01NaNNaN
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)
학번이름학과
01아이유철학
12김연아경영학
23홍길동컴퓨터
34강감찬물리학
학번이름학과
05김범수경제학
16이을용국문학
27이순신경영학
38김한국경영학
1
2
concat_df = pd.concat([df1, df2], axis=0)
concat_df
학번이름학과
01아이유철학
12김연아경영학
23홍길동컴퓨터
34강감찬물리학
05김범수경제학
16이을용국문학
27이순신경영학
38김한국경영학
1
2
concat_df.reset_index(drop=True, inplace=True)
concat_df
학번이름학과
01아이유철학
12김연아경영학
23홍길동컴퓨터
34강감찬물리학
45김범수경제학
56이을용국문학
67이순신경영학
78김한국경영학
1
This post is licensed under CC BY 4.0 by the author.

[사전학습] 2.2 데이터 변경

[사전학습] 2.4 데이터 그룹핑