본문 바로가기
공부한 것들../Pandas

Pandas 데이터 합치기

by bottle-an00 2024. 9. 14.

코드 프레소 [파이썬으로 배우는 데이터 분석: Pandas] 강의 내용 정리

 

# 데이터 합치기..?

실생활에서도 여러 데이터를 하나로 합쳐 분석을 해야하는 경우가 빈번히 발생한다. 데이터를 합칠 때 데이터의 형식 또는, 데이터에 담긴 내용이 일치하는 경우도 있겠지만 데이터 생성에 표준이 자세히 정해지지 않았다면 일치하는 경우는 드물다. 따라서 내가 원하는 형식으로 데이터를 합쳐 가공하기 위해서는 그 방법을 정확히 숙지해야한다. 

 

Pandas 라이브러리에서는 데이터를 합치기 위한 방법으로 pandas.concat()을 제공한다. 이는 2개 이상의 Series 또는, DataFrame 객체들을 하나로 합친다.

 

# API Reference

# pandas.concat

API Reference:: pandas.concat()

# parameter 정리

 

  • objs (sequence or mapping of Series or DataFrame objects):
    • 시리즈나 데이터프레임 객체들의 시퀀스 또는 매핑.
    • 매핑이 전달되면, 키로 사용할 값을 정렬된 순서로 사용한다. 모든 객체가 None일 경우 ValueError가 발생하며, 일부만 None일 경우 해당 객체는 조용히 무시된다.
  • axis ({0/’index’, 1/’columns’}, 기본값 0):
    • 연결할 축을 지정.
    • 0은 행, 1은 열을 따라 데이터를 연결한다.
  • join ({‘inner’, ‘outer’}, 기본값 ‘outer’):
    • 다른 축(또는 축들)에 있는 인덱스를 어떻게 처리할지 결정.
    • outer는 인덱스를 병합하고, inner는 교집합으로 병합한다.
  • ignore_index (bool, 기본값 False):
    • True로 설정하면 연결하는 축에서 인덱스 값을 사용하지 않고, 결과 축에 0, …, n - 1로 레이블을 지정한다.
    • 다른 축의 인덱스 값은 join 옵션에 따라 처리된다.
  • keys (sequence, 기본값 None):
    • 계층적 인덱스를 구성할 때 사용할 키를 전달한다. 여러 레벨을 전달하면 튜플로 포함되어야 하며, 전달된 키를 가장 바깥쪽 레벨로 사용해 MultiIndex를 구성한다.
  • levels (list of sequences, 기본값 None):
    • MultiIndex를 구성할 때 사용할 특정 레벨(고유값)을 지정한다. 지정하지 않으면 키에서 추론한다.
  • names (list, 기본값 None):
    • 결과 계층적 인덱스에서 사용할 레벨 이름 목록을 지정한다.
  • verify_integrity (bool, 기본값 False):
    • 새로 연결된 축에 중복이 있는지 검사한다. 이는 실제 데이터 연결에 비해 매우 비용이 많이 들 수 있다.
  • sort (bool, 기본값 False):
    • 이미 정렬되지 않은 경우, 비연결 축을 정렬한다. 단, 비연결 축이 DatetimeIndex이고, join='outer'일 경우, 축이 정렬되지 않았더라도 축은 항상 사전순으로 정렬된다.
  • copy (bool, 기본값 True):
    • False로 설정하면 데이터가 불필요하게 복사되지 않는다.

# 예시코드 :  pandas.concat을 활용해 여러 DataFrame 합치기

import pandas as pd

# 실습 데이터 생성
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
                    'B': ['B0', 'B1', 'B2', 'B3'],
                    'C': ['C0', 'C1', 'C2', 'C3'],
                    'D': ['D0', 'D1', 'D2', 'D3']},
                    index=[0, 1, 2, 3])

df2 = pd.DataFrame({'A': ['A4', 'A5', 'A6', 'A7'],
                    'B': ['B4', 'B5', 'B6', 'B7'],
                    'C': ['C4', 'C5', 'C6', 'C7'],
                    'D': ['D4', 'D5', 'D6', 'D7']},
                    index=[4, 5, 6, 7])                   

df3 = pd.DataFrame({'A': ['A8', 'A9', 'A10', 'A11'],
                    'B': ['B8', 'B9', 'B10', 'B11'],
                    'C': ['C8', 'C9', 'C10', 'C11'],
                    'D': ['D8', 'D9', 'D10', 'D11']},
                    index=[8, 9, 10, 11])

df4 = pd.DataFrame({'B': ['B2', 'B3', 'B6', 'B7'],
                    'D': ['D2', 'D3', 'D6', 'D7'],
                    'F': ['F2', 'F3', 'F6', 'F7']},
                    index=[2, 3, 6, 7])
                    
print('DF1')
print(df1)
print('\nDF2')
print(df2)
print('\nDF3')
print(df3)
print('\nDF4')
print(df4)


'''
df2, df1 합치기
'''
print('\n#1 Concat df2, df1')
result = pd.concat([df2,df1,df3],ignore_index = True)
print(result)
DF1
    A   B   C   D
0  A0  B0  C0  D0
1  A1  B1  C1  D1
2  A2  B2  C2  D2
3  A3  B3  C3  D3

DF2
    A   B   C   D
4  A4  B4  C4  D4
5  A5  B5  C5  D5
6  A6  B6  C6  D6
7  A7  B7  C7  D7

DF3
      A    B    C    D
8    A8   B8   C8   D8
9    A9   B9   C9   D9
10  A10  B10  C10  D10
11  A11  B11  C11  D11

DF4
    B   D   F
2  B2  D2  F2
3  B3  D3  F3
6  B6  D6  F6
7  B7  D7  F7

#1 Concat df2, df1
      A    B    C    D
0    A4   B4   C4   D4
1    A5   B5   C5   D5
2    A6   B6   C6   D6
3    A7   B7   C7   D7
4    A0   B0   C0   D0
5    A1   B1   C1   D1
6    A2   B2   C2   D2
7    A3   B3   C3   D3
8    A8   B8   C8   D8
9    A9   B9   C9   D9
10  A10  B10  C10  D10
11  A11  B11  C11  D11

# 예시코드 :  pandas.concat을 활용해 shape이 다른 DataFrame 합치기

import pandas as pd

# 실습 데이터 생성
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
                    'B': ['B0', 'B1', 'B2', 'B3'],
                    'C': ['C0', 'C1', 'C2', 'C3'],
                    'D': ['D0', 'D1', 'D2', 'D3']},
                    index=[0, 1, 2, 3])

df2 = pd.DataFrame({'A': ['A4', 'A5', 'A6', 'A7'],
                    'B': ['B4', 'B5', 'B6', 'B7'],
                    'C': ['C4', 'C5', 'C6', 'C7'],
                    'D': ['D4', 'D5', 'D6', 'D7']},
                    index=[4, 5, 6, 7])                   

df3 = pd.DataFrame({'A': ['A8', 'A9', 'A10', 'A11'],
                    'B': ['B8', 'B9', 'B10', 'B11'],
                    'C': ['C8', 'C9', 'C10', 'C11'],
                    'D': ['D8', 'D9', 'D10', 'D11']},
                    index=[8, 9, 10, 11])

df4 = pd.DataFrame({'B': ['B2', 'B3', 'B6', 'B7'],
                    'D': ['D2', 'D3', 'D6', 'D7'],
                    'F': ['F2', 'F3', 'F6', 'F7']},
                    index=[2, 3, 6, 7])
                    
'''
shape 이 서로 다른 df1, df4 합치기
'''
print('\n#2 Concat df1, df4')
result = pd.concat([df1,df4])
print(result)
#2 Concat df1, df4
     A   B    C   D    F
0   A0  B0   C0  D0  NaN
1   A1  B1   C1  D1  NaN
2   A2  B2   C2  D2  NaN
3   A3  B3   C3  D3  NaN
2  NaN  B2  NaN  D2   F2
3  NaN  B3  NaN  D3   F3
6  NaN  B6  NaN  D6   F6
7  NaN  B7  NaN  D7   F7

 

# 예시코드 :  pandas.concat을 활용해 shape이 다른 DataFrame 합치기

import pandas as pd

# 실습 데이터 생성
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
                    'B': ['B0', 'B1', 'B2', 'B3'],
                    'C': ['C0', 'C1', 'C2', 'C3'],
                    'D': ['D0', 'D1', 'D2', 'D3']},
                    index=[0, 1, 2, 3])

df2 = pd.DataFrame({'A': ['A4', 'A5', 'A6', 'A7'],
                    'B': ['B4', 'B5', 'B6', 'B7'],
                    'C': ['C4', 'C5', 'C6', 'C7'],
                    'D': ['D4', 'D5', 'D6', 'D7']},
                    index=[4, 5, 6, 7])                   

df3 = pd.DataFrame({'A': ['A8', 'A9', 'A10', 'A11'],
                    'B': ['B8', 'B9', 'B10', 'B11'],
                    'C': ['C8', 'C9', 'C10', 'C11'],
                    'D': ['D8', 'D9', 'D10', 'D11']},
                    index=[8, 9, 10, 11])

df4 = pd.DataFrame({'B': ['B2', 'B3', 'B6', 'B7'],
                    'D': ['D2', 'D3', 'D6', 'D7'],
                    'F': ['F2', 'F3', 'F6', 'F7']},
                    index=[2, 3, 6, 7])
'''
슬라이싱을 통해 일부 데이터 합치기
'''
print('\n#3 Concat df1, df4 by slicing')
result = pd.concat([df1[:2],df4[3:]])
print(result)
#3 Concat df1, df4 by slicing
     A   B    C   D    F
0   A0  B0   C0  D0  NaN
1   A1  B1   C1  D1  NaN
7  NaN  B7  NaN  D7   F7

# 예시코드 :  pandas.concat을 활용해 행 기준으로 DataFrame 합치기

import pandas as pd

# 실습 데이터 생성
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
                    'B': ['B0', 'B1', 'B2', 'B3'],
                    'C': ['C0', 'C1', 'C2', 'C3'],
                    'D': ['D0', 'D1', 'D2', 'D3']},
                    index=[0, 1, 2, 3])

df2 = pd.DataFrame({'A': ['A4', 'A5', 'A6', 'A7'],
                    'B': ['B4', 'B5', 'B6', 'B7'],
                    'C': ['C4', 'C5', 'C6', 'C7'],
                    'D': ['D4', 'D5', 'D6', 'D7']},
                    index=[4, 5, 6, 7])                   

df3 = pd.DataFrame({'A': ['A8', 'A9', 'A10', 'A11'],
                    'B': ['B8', 'B9', 'B10', 'B11'],
                    'C': ['C8', 'C9', 'C10', 'C11'],
                    'D': ['D8', 'D9', 'D10', 'D11']},
                    index=[8, 9, 10, 11])

df4 = pd.DataFrame({'B': ['B2', 'B3', 'B6', 'B7'],
                    'D': ['D2', 'D3', 'D6', 'D7'],
                    'F': ['F2', 'F3', 'F6', 'F7']},
                    index=[2, 3, 6, 7])
'''
행 기준으로 df1, df4 합치기
'''
print('\n#4 Concat df1, df4 by axis=1')
result = pd.concat([df1,df4],axis=1, ignore_index=True)
print(result)
#4 Concat df1, df4 by axis=1
     0    1    2    3    4    5    6
0   A0   B0   C0   D0  NaN  NaN  NaN
1   A1   B1   C1   D1  NaN  NaN  NaN
2   A2   B2   C2   D2   B2   D2   F2
3   A3   B3   C3   D3   B3   D3   F3
6  NaN  NaN  NaN  NaN   B6   D6   F6
7  NaN  NaN  NaN  NaN   B7   D7   F7

# 예시코드 :  pandas.concat을 활용해 교집합으로  DataFrame 합치기

import pandas as pd

# 실습 데이터 생성
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
                    'B': ['B0', 'B1', 'B2', 'B3'],
                    'C': ['C0', 'C1', 'C2', 'C3'],
                    'D': ['D0', 'D1', 'D2', 'D3']},
                    index=[0, 1, 2, 3])

df2 = pd.DataFrame({'A': ['A4', 'A5', 'A6', 'A7'],
                    'B': ['B4', 'B5', 'B6', 'B7'],
                    'C': ['C4', 'C5', 'C6', 'C7'],
                    'D': ['D4', 'D5', 'D6', 'D7']},
                    index=[4, 5, 6, 7])                   

df3 = pd.DataFrame({'A': ['A8', 'A9', 'A10', 'A11'],
                    'B': ['B8', 'B9', 'B10', 'B11'],
                    'C': ['C8', 'C9', 'C10', 'C11'],
                    'D': ['D8', 'D9', 'D10', 'D11']},
                    index=[8, 9, 10, 11])

df4 = pd.DataFrame({'B': ['B2', 'B3', 'B6', 'B7'],
                    'D': ['D2', 'D3', 'D6', 'D7'],
                    'F': ['F2', 'F3', 'F6', 'F7']},
                    index=[2, 3, 6, 7])
'''
교집합으로 데이터 결합하기
'''
print('\n#5 Concat df1, df4 by join=inner')
result = pd.concat([df1,df4], join = 'inner', axis=1)
print(result)

 

#5 Concat df1, df4 by join=inner
    A   B   C   D   B   D   F
2  A2  B2  C2  D2  B2  D2  F2
3  A3  B3  C3  D3  B3  D3  F3

'공부한 것들.. > Pandas' 카테고리의 다른 글

Pandas 데이터 그룹화  (1) 2024.09.14
Pandas 집계함수  (0) 2024.09.14
Pandas 인덱싱(Indexing) & 슬라이싱(Slicing)  (0) 2024.09.14
Pandas 결측치 이해 및 결측치 처리  (2) 2024.09.14
Pandas 데이터 파일 읽기  (1) 2024.09.14