본문 바로가기

코딩/Python

[Python/파이썬] Pandas Dataframe 결합 : Concat

반응형

※ 이 글을 쓰는 사람은 SW 비전공자입니다.

※ 개인 공부를 위해 정리하는 글이며, 작성한 코드들은 효율성, 깔끔함(?) 등과는 거리가 멀 수 있습니다.

 

1편 : 2021.03.31 - [코딩/Python] - [Python/파이썬] Pandas 기초 정리 : Series, Dataframe 개념 정리

2편 : 2021.04.01 - [코딩/Python] - [Python/파이썬] Pandas 기초 정리 : 엑셀 파일(.xlsx) Dataframe으로 만들기

3편 : 2021.04.03 - [코딩/Python] - [Python/파이썬] Pandas 기초 정리 : Dataframe 내부 데이터 조회 방법

4편 : 2021.04.05 - [코딩/Python] - [Python/파이썬] Pandas 기초 정리 : Dataframe 행, 열 추가 방법

5편 : 2021.04.11 - [코딩/Python] - [Python/파이썬] Pandas 기초 정리 : Dataframe 행, 열 삭제하기(drop 함수)

6편 : 2021.04.13 - [코딩/Python] - [Python/파이썬] Pandas 기초 정리 : 원소바꾸기, dropna(), fillna()

7편 : 2021.04.24 - [코딩/Python] - [Python/파이썬] Pandas Dataframe 결합 : Concat

8편 : 2021.04.25 - [코딩/Python] - [Python/파이썬] Pandas Dataframe 결합 : Merge


  Pandas의 dataframe끼리 결합하는 함수는 크게 Merge, Concat, Join이 있다. 이전에 다뤘던 append 함수도 있다. concat과 append는 dataframe 을 추가하는 방법에 대해 간단하게 언급했었다.

 (참고링크 : 2021.04.05 - [코딩/Python] - [Python/파이썬] Pandas 기초 정리 : Dataframe 행, 열 추가 방법)

 

  dataframe을 결합하는 함수로 Merge와 Concat을 많이 사용하는데 여러 파라미터값 설정을 통해 다양한 방식으로 결합할 수 있다.

오늘은 Concat에 대해 자주 쓰이는 파라미터를 기준으로 정리해보고자 한다.

 

  먼저, concat과 merge의 차이점은 아래와 같다.


-. concat  : 단순히 2개의 dataframe 을 합치는 것에 중점

 

-. merge : 2개의 dataframe을 설정한 기준대로 합치는 것(어떤 Column을 기준으로 하는가 등)


  사실 위처럼 말로만 들으면 이해가 안가니 실제 코드로 이해해보고자 하였다. 내용이 많은 관계로 이번 포스팅은 concat에 대해서만 정리. 먼저 사용할 dataframe은 총 3개이다.(df1, df2, df3)

 

 

-. 엑셀 파일을 주로 활용하므로 1개의 엑셀파일에 3개의 sheet(수강생정보, 중간고사점수, 기말고사점수) 존재

-. 해당 시트별로 data들을 pd.read_excel 함수를 통해 dataframe화 하였음.

-. 아래 결과에서 보면 알겠지만 df2의 index 0,4번째는 test를 위해 일부로 똑같은 data를 입력하였다.

 

 

<코드>

#dataframe 생성(엑셀 파일 통해 생성)
df1 = pd.read_excel("df_test.xlsx", engine="openpyxl", sheet_name="수강생정보")
df2 = pd.read_excel("df_test.xlsx", engine="openpyxl", sheet_name="중간고사점수")
df3 = pd.read_excel("df_test.xlsx", engine="openpyxl", sheet_name="기말고사점수")

#dataframe 출력해보기 (df1, df2, df3)
print("원본")
print("\n")
print(df1)
print("\n")
print(df2)
print("\n")
print(df3)

 

#df1 : 수강생정보
      이름  나이        연락처
0     YB    30     +81-0000-0000
1     SW    29     +81-0000-0001
2     EJ    28     +81-0000-0002
3     HJ    27     +81-0000-0003
4  James    20     +81-0000-0004
5  Borwn    21     +81-0000-0005


#df2 : 중간고사점수(index 0, 4번째 점수는 일부로 중복으로 입력)
   이름   시험구분  국어  영어  수학
0  YB     중간고사  100   90     80
1  SW     중간고사   70   60     50
2  EJ     중간고사   40    5     20
3  HJ     중간고사   10    5      1
4  YB     중간고사  100   90     80


#df3 : 기말고사 점수
   이름  시험구분   국어   영어   수학
0  YB    기말고사  100     100    100
1  SW    기말고사   70      70     70
2  EJ    기말고사   20      20     20
3  HJ    기말고사   10      10    10

 

1. 그냥 이어 붙이기(df2, df3)

 

-. 그냥 이어 붙인다.(합치기)

-. 뒤에서 다루겠지만 concat 파라미터 중 join = 'outer'가 default값이므로 합집합이 기본 결과이다.

-. 중복행이 그대로 입력된다.

-. 인덱스번호도 그대로 입력된다.

 

 

<코드>

print("#그냥 이어붙이기")
df_concat1 = pd.concat([df2,df3])
print(df_concat1)

 

#그냥 이어붙이기
   이름  시험구분   국어   영어   수학
0  YB  중간고사  100   90   80
1  SW  중간고사   70   60   50
2  EJ  중간고사   40    5   20
3  HJ  중간고사   10    5    1
4  YB  중간고사  100   90   80
0  YB  기말고사  100  100  100
1  SW  기말고사   70   70   70
2  EJ  기말고사   20   20   20
3  HJ  기말고사   10   10   10

 

 

2. index 초기화하기, 또는 컬럼 중 인덱스로 설정하기(df2, df3)

 

-. index 번호를 초기화하려면 ignore_index = True를 넣어준다.(False가 default이므로 1번과 같은 결과가 나온다.)

-. 마찬가지로 index 중 0번, 4번과 같은 중복 데이터는 삭제되지 않는다.

 

 

<코드>

print("#index 초기화시키기")
df_concat2 = pd.concat([df2,df3], ignore_index=True)
print(df_concat2)

 

#index 초기화시키기
   이름  시험구분   국어   영어   수학
0  YB  중간고사  100   90   80
1  SW  중간고사   70   60   50
2  EJ  중간고사   40    5   20
3  HJ  중간고사   10    5    1
4  YB  중간고사  100   90   80
5  YB  기말고사  100  100  100
6  SW  기말고사   70   70   70
7  EJ  기말고사   20   20   20
8  HJ  기말고사   10   10   10

 

 

 

-. 만약 dataframe의 일부 컬럼을 인덱스로 설정하려면 set_index 함수를 활용하자.

-. 이전 포스팅에서도 다뤘지만 함수 내부에 inplace=True를 입력하면 원본 dataframe이 수정된다.

   (inplace=True를 활용하지 않으려면 새로운 변수에 수정한 df를 할당해야 한다.)

-. 마찬가지로 중복행은 삭제되지 않는다.

 

 

<코드>

print("#이름열을 index로 설정하기")
df_concat2.set_index('이름', inplace=True)
print(df_concat2)

 

#이름열을 index로 설정하기
    시험구분   국어   영어   수학
이름
YB  중간고사  100   90   80
SW  중간고사   70   60   50
EJ  중간고사   40    5   20
HJ  중간고사   10    5    1
YB  중간고사  100   90   80
YB  기말고사  100  100  100
SW  기말고사   70   70   70
EJ  기말고사   20   20   20
HJ  기말고사   10   10   10

 

 

3. 열 단위로 이어 붙이기

 

-. 열 단위로 이어 붙이려면 axis=1 파라미터값을 입력하면 된다.

-. 1번,2번에서 다뤘던 방식은 행 단위로 이어 붙이는 방식이다.(axis=0)

-. 이전 포스팅에서 axis=0 vs axis=1 파라미터를 다룬적이 있으니 아래 링크를 참고

(참고링크 : 2021.04.11 - [코딩/Python] - [Python/파이썬] Pandas 기초 정리 : Dataframe 행, 열 삭제하기(drop 함수))

 

 

<코드>

print("#열단위로 이어 붙이기")
df_concat3 = pd.concat([df2,df3], axis=1)
print(df_concat3)

 

#열단위로 이어 붙이기
   이름  시험구분   국어  영어  수학   이름  시험구분     국어     영어     수학
0  YB  중간고사  100  90  80   YB  기말고사  100.0  100.0  100.0
1  SW  중간고사   70  60  50   SW  기말고사   70.0   70.0   70.0
2  EJ  중간고사   40   5  20   EJ  기말고사   20.0   20.0   20.0
3  HJ  중간고사   10   5   1   HJ  기말고사   10.0   10.0   10.0
4  YB  중간고사  100  90  80  NaN   NaN    NaN    NaN    NaN

 

-. 위 결과에서 보듯이 열단위로 기말고사 탭부분이 추가되었다. 중복되는 열이름은 그대로 출력된다.

-. index 중 4번 YB의 경우 기말고사 내용이 없으므로 NaN(결측) 표시 된다.

 

 

 

4. 교집합, 합집합 출력하기(df1, df2)

 

-. 위에서 다뤘던 부분은 합집합이 출력되는 부분이다.(join='outer'가 default )

-. 2개의 df 중 Size가 일치하는 교집합  부분만 출력하려면 join='inner'를 입력한다.

 

 

<코드>

#join=outer는 합집합으로 default값, inner는 교집합으로 붙이기
print("#교집합")
df_concat4 = pd.concat([df1,df2], axis=1, join='inner')
print(df_concat4)

 

#교집합
      이름  나이      연락처    이름  시험구분   국어  영어  수학
0     YB    30    +81-0000-0000  YB  중간고사    100    90    80
1     SW    29    +81-0000-0001  SW  중간고사     70    60    50
2     EJ    28    +81-0000-0002  EJ  중간고사     40     5    20
3     HJ    27    +81-0000-0003  HJ  중간고사     10     5     1
4  James    20    +81-0000-0004  YB  중간고사    100    90    80

 

-. 결과에서 보면 알겠지만 수강생 정보 중 이름 'brown' 의 정보는 생략된다.

-. 참고링크에서 교집합 출력하기라고 해서 봤는데 정확히는 교집합 출력이 아니라 Size가 맞는 dataframe까지만 합쳐서 보여주는것 을 말하는 것 같다.

-. 중간고사 df2에서 data 순서를 무작위로 바꿔보면 아래와 같이 나온다.

   (이름 교집합 출력이 아닌 것을 알 수 있다.)

 

#교집합
      이름  나이     연락처    이름  시험구분   국어  영어  수학
0     YB    30  +81-0000-0000  EJ    중간고사    40    5    20
1     SW    29  +81-0000-0001  HJ    중간고사    10    5     1
2     EJ    28  +81-0000-0002  YB    중간고사   100   90    80
3     HJ    27  +81-0000-0003  SW    중간고사    70   60    50
4  James    20  +81-0000-0004  YB    중간고사   100   90    80

 

-. 반대로 join='outer'를 설정하면 아래와 같이 결과가 나온다.(default이므로 파라미터값읍 입력하지 않아도 됨)

-. 위와 마찬가지로 dataframe 중 크기가 큰 df 기준으로 모든 data가 순차적으로 합쳐져 출력되는 것이다.

   (index 4번행으 James와 YB를 보면 알 수 있음.) 

-. borwn은 중간고사 성적이 없으므로 Nan 표시

 

 

<코드>

print("#합집합")
df_concat4 = pd.concat([df1,df2], axis=1, join="outer")
print(df_concat4)

 

#합집합
      이름  나이    연락처     이름 시험구분  국어    영어  수학
0     YB    30  +81-0000-0000   YB  중간고사  100.0  90.0  80.0
1     SW    29  +81-0000-0001   SW  중간고사   70.0  60.0  50.0
2     EJ    28  +81-0000-0002   EJ  중간고사   40.0   5.0  20.0
3     HJ    27  +81-0000-0003   HJ  중간고사   10.0   5.0   1.0
4  James    20  +81-0000-0004   YB  중간고사  100.0  90.0  80.0
5  Borwn    21  +81-0000-0005   NaN   NaN      NaN    NaN   NaN

 

 

5. Series 이어 붙이기

 

-. concat은 Series를 기존 df에 이어붙일 수 있다.

-. 아래와 같이 새로운 Series type의 data를 3개 생성하였다.(sr1, sr2, sr3)

-. name이 붙은 Series는 Column 계열이며, index가 붙은 Series는 Row 계열이다.

 

 

<코드>

sr1 = pd.Series(['1등급','2등급','3등급','4등급'], name = '등급')
sr2 = pd.Series(['YB', 'SW', 'HJ', 'EJ'], name='이름')
sr3 = pd.Series(['james', 'brown', 'apple'], index = ['a','b','c'])

 

 

1) df와 Series 이어붙이기(열)

 

 

<코드>

#df와 Series 이어 붙이기(Column)
df_concat5= pd.concat([df2,sr1], axis=1)
print("df와 Series 이어 붙이기(Column)")
print(df_concat5)

 

   이름시험구분  국어 영어 수학   등급
0  YB  중간고사  100  90  80     1등급
1  SW  중간고사   70  60  50     2등급
2  EJ  중간고사   40   5  20     3등급
3  HJ  중간고사   10   5   1     4등급
4  YB  중간고사  100  90  80      NaN

 

 

2) Series와 Series 이어붙이기(열)

 

 

<코드>

#Series와 Series 이어붙이기(Column)
df_concat6 = pd.concat([sr2,sr1], axis=1)
print("Series와 Series 이어붙이기(Column)")
print(df_concat6)

 

   이름   등급
0  YB  1등급
1  SW  2등급
2  HJ  3등급
3  EJ  4등급

 

 

3) Series와 Series 이어붙이기(행)

 

 

<코드>

#Series와 Series 이어붙이기(Row)
df_concat7 = pd.concat([sr2,sr3], axis=0)
print("Series와 Series 이어붙이기(Row)")
print(df_concat7)

 

0       YB
1       SW
2       HJ
3       EJ
a    james
b    brown
c    apple

 

 


참고링크

1. pandas.pydata.org/pandas-docs/stable/user_guide/merging.html

 

Merge, join, concatenate and compare — pandas 1.2.4 documentation

The concat() function (in the main pandas namespace) does all of the heavy lifting of performing concatenation operations along an axis while performing optional set logic (union or intersection) of the indexes (if any) on the other axes. Note that I say

pandas.pydata.org

2. yganalyst.github.io/data_handling/Pd_12/

 

[Pandas 기초] 데이터프레임 합치기(merge, join, concat)

판다스 데이터프레임을 병합하는 여러가지 함수에 대해 알아보자

yganalyst.github.io

 

 

728x90