Data Transformation - Merging Data
Page content
강의 홍보
- 취준생을 위한 강의를 제작하였습니다.
- 본 블로그를 통해서 강의를 수강하신 분은 게시글 제목과 링크를 수강하여 인프런 메시지를 통해 보내주시기를 바랍니다.
스타벅스 아이스 아메리카노를 선물
로 보내드리겠습니다.
- [비전공자 대환영] 제로베이스도 쉽게 입문하는 파이썬 데이터 분석 - 캐글입문기
공지
제 수업을 듣는 사람들이 계속적으로 실습할 수 있도록 강의 파일을 만들었습니다. 늘 도움이 되기를 바라며. 참고했던 교재 및 Reference
는 꼭 확인하셔서 교재 구매 또는 관련 Reference
를 확인하시기를 바랍니다.
- 데이터는 코로나 데이터를 활용했다.
I. Data Transform Overview
-
데이터 변환은 데이터를 하나의 형식이나 구조에서 다른 형식이나 구조로 변환하는 데 사용되는 기법이다.
Data deduplication
데이터 중복 제거에는 중복된 데이터 식별 및 제거가 포함된다.Key restructuring
의미가 내장된 모든 키를 일반 키로 변환하는 것을 포함한다.Data Cleansing
은 소스 데이터의 정확성을 높이기 위해 의미나 정보를 추출하지 않고 소스 언어에서 단어를 추출하고 구식, 부정확, 불완전한 정보를 삭제하는 것을 포함함.Data aggregation
는 서로 다른 유형의 보고 시스템에서 중요한 정보를 검색, 추출, 요약 및 보존하는 것을 포함함.Data integration
은 다른 데이터 유형을 변환하여 공통 구조나 스키마로 통합하는 것을 포함한다.Data filtering
은 데이터 필터링은 특정 사용자와 관련된 정보를 식별하는 것을 포함한다.Data joining
은 두 개 이상의 테이블 간의 관계를 설정하는 것이 포함된다.
-
데이터를 변환하는 주된 이유는 변환된 데이터가 다른 데이터와 호환될 수 있도록 더 나은 대표성을 갖기 위함이다.
-
이것 외에도, 시스템에서의 상호운용성은 공통 데이터 구조와 포맷을 따름으로써 달성 될 수 있다.
II. Merging database style dataframes
- 서로 다른 두개의 데이터를
merge
할 때,concat
이라는 함수를 사용한다. - 사용법은 아래와 같다.
dataframe = pd.concat([dataFrame1, dataFrame2], ignore_index=True)
dataframe
- 앞의 코드의 출력은 두 표 모두를 결합한 단일 데이터프레임이다.
ignore_index
인수는 인덱스의 순서와 연관이 있다. 만약ignore_index=False
로 지정한다면, 기존 인덱스의 순서는 그대로 유지된다.
(1) axis=0
- 두개의 서로 다른 테이블을 위아래로 합친다는 뜻이다. 간단하게 코드를 통해 예를 확인하자.
# package import
import pandas as pd
# 데이터 생성
df1 = pd.DataFrame([['a', 1], ['b', 2]],
columns=['letter', 'number'])
df2 = pd.DataFrame([['c', 3], ['d', 4]],
columns=['letter', 'number'])
print(df1)
print(df2)
letter number
0 a 1
1 b 2
letter number
0 c 3
1 d 4
temp = pd.concat([df1, df2], axis=0)
print(temp)
letter number
0 a 1
1 b 2
0 c 3
1 d 4
(2) axis=1
- 두개의 서로 다른 테이블을 왼쪽에서 오른쪽 순으로 합친다는 뜻이다.
temp = pd.concat([df1, df2], axis=1)
print(temp)
letter number letter number
0 a 1 c 3
1 b 2 d 4
III. Real Problems and Solutions
Chapter II.
의 예제들은 기본적으로 쉬운 예제에 속한다. 그런다면 실전은 어떨까?- 다음 예제 데이터프레임을 확인해보자.
df1SE = pd.DataFrame({ 'StudentID': [9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29],
'ScoreSE' : [22, 66, 31, 51, 71, 91, 56, 32, 52, 73, 92]})
print(df1SE)
StudentID ScoreSE
0 9 22
1 11 66
2 13 31
3 15 51
4 17 71
5 19 91
6 21 56
7 23 32
8 25 52
9 27 73
10 29 92
df2SE = pd.DataFrame({'StudentID': [2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30],
'ScoreSE': [98, 93, 44, 77, 69, 56, 31, 53, 78, 93, 56, 77, 33, 56, 27]})
print(df2SE)
StudentID ScoreSE
0 2 98
1 4 93
2 6 44
3 8 77
4 10 69
5 12 56
6 14 31
7 16 53
8 18 78
9 20 93
10 22 56
11 24 77
12 26 33
13 28 56
14 30 27
df1ML = pd.DataFrame({ 'StudentID': [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29],
'ScoreML' : [39, 49, 55, 77, 52, 86, 41, 77, 73, 51, 86, 82, 92, 23, 49]})
print(df1ML)
StudentID ScoreML
0 1 39
1 3 49
2 5 55
3 7 77
4 9 52
5 11 86
6 13 41
7 15 77
8 17 73
9 19 51
10 21 86
11 23 82
12 25 92
13 27 23
14 29 49
df2ML = pd.DataFrame({'StudentID': [2, 4, 6, 8, 10, 12, 14, 16, 18, 20],
'ScoreML': [93, 44, 78, 97, 87, 89, 39, 43, 88, 78]})
print(df2ML)
StudentID ScoreML
0 2 93
1 4 44
2 6 78
3 8 97
4 10 87
5 12 89
6 14 39
7 16 43
8 18 88
9 20 78
- 실전에서는 이렇게 데이터의 행의 개수가 다른 것이 태반이다.
- 또한, 모든 학생이
ML
수업,SE
수업을 수강한 것이 아니다. - 위와 같은 상황에서 하나의 데이터셋으로 만드는 과정을 기술하려고 한다.
(1) Concatening along with an axis
- 첫번째 옵션으로 지금까지 진행한 방법으로
axis
를 활용한다.
dfSE = pd.concat([df1SE, df2SE], ignore_index=True)
dfML = pd.concat([df1ML, df2ML], ignore_index=True)
data = pd.concat([dfML, dfSE], axis=1)
print(data.tail(10))
StudentID ScoreML StudentID ScoreSE
16 4.0 44.0 12 56
17 6.0 78.0 14 31
18 8.0 97.0 16 53
19 10.0 87.0 18 78
20 12.0 89.0 20 93
21 14.0 39.0 22 56
22 16.0 43.0 24 77
23 18.0 88.0 26 33
24 20.0 78.0 28 56
25 NaN NaN 30 27
- 먼저,
SE
데이터끼리 합치고, 그 다음에는ML
데이터끼리 조합을 했다. - 그 후에
axis=1
인수를 추가하여side by side
데이터를 조합 한다.
(2) Using df.merge with an inner join
- 이번에는
merge()
를 활용하자.
merge_data = dfSE.merge(dfML, how='inner')
print(merge_data)
StudentID ScoreSE ScoreML
0 9 22 52
1 11 66 86
2 13 31 41
3 15 51 77
4 17 71 73
5 19 91 51
6 21 56 86
7 23 32 82
8 25 52 92
9 27 73 23
10 29 92 49
11 2 98 93
12 4 93 44
13 6 44 78
14 8 77 97
15 10 69 87
16 12 56 89
17 14 31 39
18 16 53 43
19 18 78 88
20 20 93 78
- 위 코드에서 알 수 있는 것은
SE
코스와ML
코스를 두개 모두 수강한 학생 기록을 알 수 있다. (총 21명) - 그 외에도
join
의 여러가지 유형이 있다.inner join
- 내부 조인은 둘 이상의 데이터 프레임에서 교차점을 취한다. 구조화 질의 언어(SQL)의 INER JOIN에 해당한다.outer join
- 외부 조인은 둘 이상의 데이터 프레임에서 결합을 가져온다. SQL의 FULL OUTER JOIN에 해당한다.left join
- 왼쪽 조인은 왼쪽 데이터 프레임의 키만 사용한다. SQL의 왼쪽 외부 조인에 해당한다.right join
- 오른쪽 조인(join)은 오른쪽 데이터 프레임의 키만 사용하며, SQL의 Right OUTER JOIN과 유사하다.
(3) Merging on index
- 데이터 프레임의 병합키는 데이터 프레임의 인덱스에 위치한다.
left_index=True
또는right_index=True
를 지정하면 각 데이터 프레임의index
를 병합 키로 활용한다.
left1 = pd.DataFrame({'key': ['apple','ball','apple', 'apple', 'ball', 'cat'], 'value': range(6)})
print(left1)
key value
0 apple 0
1 ball 1
2 apple 2
3 apple 3
4 ball 4
5 cat 5
right1 = pd.DataFrame({'group_val': [33.4, 5]}, index=['apple', 'ball'])
print(right1)
group_val
apple 33.4
ball 5.0
- 위 2개의 데이터에서
right1
데이터셋의 인덱스는apple & ball
이다. - 이 때,
right1
의 데이터를 병합키로 활용하려면right_index=True
를 해주면 된다. - 반면에,
left1
의 데이터에서 병합키는key
값이다. 이 때에는left_on='key'
라고 지정해주면 된다.
df = pd.merge(left1, right1, left_on='key', right_index=True)
print(df)
key value group_val
0 apple 0 33.4
2 apple 2 33.4
3 apple 3 33.4
1 ball 1 5.0
4 ball 4 5.0
- 이 때, 만약에 위에서 배운
join
유형을 지정하게 되면 지정값에 따라 데이터는 다르게 병합된다. - 간단한 예로
outer join
을 시도하자.
df = pd.merge(left1, right1, left_on='key', right_index=True, how='outer')
print(df)
key value group_val
0 apple 0 33.4
2 apple 2 33.4
3 apple 3 33.4
1 ball 1 5.0
4 ball 4 5.0
5 cat 5 NaN
- 처음에 시도했을 때 나타나지 않았던
cat
값이 등장한 것을 확인할 수 있다.
VI. Reference
Piepenbreier, N. (2020, April 16). Automate Your (Boring!) Excel Reporting with Python!. Retrieved from https://towardsdatascience.com/automate-excel-reporting-with-python-233dd61fb0f2