- 세로 방향(index 증가 방향)으로 통합하기
우선 통합할 두 DataFrame 데이터를 생성한다.
import pandas as pd
import numpy as np
df1 = pd.DataFrame({
'Class1' : [95,92,98,100],
'Class2' : [91,93,97,99]
})
df1
# out :
df2 = pd.DataFrame({
'Class1' : [87,89],
'Class2' : [85,90]
})
df2
# out :
이후 'append()'를 이용했는데 오류가 났다.
https://pandas.pydata.org/pandas-docs/version/1.4/reference/api/pandas.DataFrame.append.html
위 링크를 확인하면 pandas 버전 1.4.0 이후로 append를 지원하지 않으니 concat 사용을 권장함을 알 수 있다.
https://pandas.pydata.org/docs/reference/api/pandas.concat.html
concat()의 사용법은 위 링크에서 찾아볼 수 있다.
concat()을 이용하여 df1과 df2 데이터를 세로로 합친다.
result = pd.concat([df1, df2])
result
# out:
위 결과를 보면 index 번호가 정리되지 않은 것을 볼 수 있다. df3이라는 새로운 데이터를 추가하면서 ignore_index=True를 통해 index 정렬을 하면 아래와 같다.
df3 = pd.DataFrame({
'Class1' : [96, 83]
})
pd.concat([result,df3], ignore_index=True) # ignore_index=True : 열 정렬
# out :
- 가로 방향(columns 증가 방향)으로 통합하기
pd.concat()을 통해 데이터를 세로 방향으로 통합했다면, join()을 통해 DataFrame 데이터를 가로 방향으로 통합할 수 있다.
df4 데이터를 새로 만들어서 위의 df1 데이터와 가로 통합을 하면 아래와 같다.
df4 = pd.DataFrame({
'Class3' : [93, 91, 95, 98]
})
df1.join(df4)
# out :
여기에 인덱스 이름을 추가하는 방법은 아래와 같다.
index_label = ['a','b','c','d']
df1a = pd.DataFrame({'Class1': [95, 92, 98, 100],
'Class2': [91, 93, 97, 99]}, index= index_label)
df4a = pd.DataFrame({'Class3': [93, 91, 95, 98]}, index=index_label)
df1a.join(df4a) # index_label을 인덱스 이름으로 추가
# out :
index_label이 인덱스 이름으로 추가되었다.
join()을 사용하려면 인덱스가 같아야 한다. 불일치할 경우 아래와 같은 결과가 나온다.
index_label = ['a','b','c','d']
df1a = pd.DataFrame({'Class1': [95, 92, 98, 100],
'Class2': [91, 93, 97, 99]})
df4a = pd.DataFrame({'Class3': [93, 91, 95, 98]}, index=index_label)
df1a.join(df4a) # 인덱스 번호가 서로 불일치한 상태에서 join()하니 이런 결과 나옴
# 인덱스가 같은지 확인하고 join() 하기!
# out :
df4의 데이터는 NaN으로 표시되며 출력되지 않았다.
df4a.index == df1a.index # 인덱스 일치하는지 확인하는 방법
# array([False, False, False, False])
인덱스가 다르면 False로 표시됨을 알 수 있다. (같으면 True)
- 특정 열을 기준으로 통합하기
특정 열을 키(key)라고 하는데, 두 개의 DataFrame 데이터에 공통된 열이 있을 때 merge()를 통해 그 열을 기준으로 데이터를 통합할 수 있다.
우선 열이 같은 두 개의 데이터를 생성한다.
df_A_B = pd.DataFrame({'판매월': ['1월', '2월', '3월', '4월'],
'제품A': [100, 150, 200, 130],
'제품B': [90, 110, 140, 170]})
df_A_B
# out :
df_C_D = pd.DataFrame({'판매월': ['1월', '2월', '3월', '4월'],
'제품C': [112, 141, 203, 134],
'제품D': [90, 110, 140, 170]})
df_C_D
# out :
이제 merge()를 사용하여 공통된 '판매월' 열 데이터를 가진 두 데이터를 통합한다.
df_A_B.merge(df_C_D)
# out :
merge와 달리 join은 행이 중복될 경우 에러가 발생한다.
# merge와 join의 차이는 무엇일까?
df_A_B.join(df_C_D) # join은 columns가 중복되면 합쳐지지 않는다.(에러 메시지 확인)
두 DataFrame 데이터가 특정 열을 기준으로 일부만 공통된 값을 갖는 경우 merge()에 선택 인자를 지정하여 통합을 할 수 있다.
형식은 아래와 같다.
df_left.merge(df_right, how = merge_method, on = key_label)
표에 있는 how 선택 인자를 통해 통합 방법(merge_methon)을 지정하고, 기준으로 할 특정 열(key)을 입력하면 된다. on 인자를 입력하지 않으면 자동으로 두 데이터에서 공통적으로 포함된 열이 선택된다.
예시는 다음과 같다.
우선 두 개의 DataFrame 데이터를 생성한 후 how 값을 지정하면 된다.
df_left = pd.DataFrame({'key':['A','B','C'], 'left': [1, 2, 3]})
df_right = pd.DataFrame({'key':['A','B','D'], 'right': [4, 5, 6]})
1) left
df_left의 'key' 값과 일치하는 'right'의 값만이 출력된다.
df_left.merge(df_right, how = 'left', on = 'key')
# out :
2) right
df_right의 'key'값과 일치하는 'left'값만 출력된다.
df_left.merge(df_right, how = 'right', on = 'key')
# out :
3) outer
df_left와 df_right의 'key'가 모두 출력되고, 'key' 열과 일치하는 'left'와 'right' 데이터가 출력된다. 항목에 데이터가 없을 땐 NaN이 출력된다.
df_left.merge(df_right, how = 'outer', on = 'key') # FULL JOIN
# out:
4) inner
df_left와 df_right의 'key' 열 중 공통된 데이터만 출력된다.
df_left.merge(df_right, how = 'inner', on = 'key') # 교집합
# out :
* 테이블 조인 전에 ERD 다이어그램 설계부터 한다! (분석 목적에 따라서)
'Python' 카테고리의 다른 글
[seaborn] 데이터 시각화(+matplotlib) (1) | 2024.01.08 |
---|---|
[pandas] 엑셀 파일 불러오기, 내보내기 (1) | 2024.01.08 |
[matplotlib] 데이터 시각화 (1) | 2024.01.06 |
[pandas] 데이터 불러오기 (0) | 2024.01.06 |
pandas 간단 정리 (1) | 2024.01.06 |