※ 이 글을 쓰는 사람은 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
2. yganalyst.github.io/data_handling/Pd_12/
'코딩 > Python' 카테고리의 다른 글
[Python/파이썬] 특정 시간에 파이썬 코드 동작시키기 - schedule 모듈 (0) | 2021.05.16 |
---|---|
[Python/파이썬] Pandas Dataframe 결합 : Merge (0) | 2021.04.25 |
[Python/파이썬] Pandas 기초 정리 : 엑셀 파일(.xlsx) Dataframe으로 만들기, Datarame을 다시 엑셀파일(xlsx)로 저장하기 (0) | 2021.04.01 |
[Python/파이썬] PyQt5 사용시 필요한 쓰레드 개념 이해 : 파이썬 GUI 응답없음 해결 방법 - 2 (11) | 2021.03.30 |
[Python/파이썬] PyQt5 사용시 필요한 쓰레드 개념 이해 : 파이썬 GUI 응답없음 해결 방법 - 1 (2) | 2021.03.29 |