Python

[pandas] 데이터 통합하기

jsys 2024. 1. 8. 11:41

 

- 세로 방향(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.DataFrame.append — pandas 1.4.4 documentation

Sort columns if the columns of self and other are not aligned. Changed in version 1.0.0: Changed to not sort by default.

pandas.pydata.org

위 링크를 확인하면 pandas 버전 1.4.0 이후로 append를 지원하지 않으니 concat 사용을 권장함을 알 수 있다.

 

 

https://pandas.pydata.org/docs/reference/api/pandas.concat.html

 

pandas.concat — pandas 2.1.4 documentation

If True, do not use the index values along the concatenation axis. The resulting axis will be labeled 0, …, n - 1. This is useful if you are concatenating objects where the concatenation axis does not have meaningful indexing information. Note the index

pandas.pydata.org

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