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