일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- Oracle VM VirtualBox
- dbeaver
- PYTHON
- RFP
- 데이터베이스
- csharp
- 오라클
- putty
- sql
- python algorithm
- 파이썬 데이터프레임
- Algorithm
- 코딩테스트
- C#
- Oracle
- it 용어
- linux
- HTML
- 리눅스
- Python 라이브러리
- 리눅스 명령어
- 파이썬
- it용어
- 파이썬 알고리즘
- 파이썬 전처리
- MariaDB
- Python DataFrame
- tibero
- 알고리즘
- VirtualBox
- Today
- Total
오경석의 개발노트
Python_DataFrame merge, join, concat 본문
1. DataFrame 붙이기 : pd.concat()
pd.concat()는 DataFrame을 말 그대로 물리적으로 이어 붙인다.
concat() for combining DataFrames across rows or columns
해당 method의 옵션들은 다음과 같다.
pd.concat(objs, # Series, DataFrame, Panel object
axis=0, # default(행방향), 1 : 열방향
join='outer', # default, 'inner'
ignore_index=False, default(기존 index 유지), True : 기존 index 무시
keys=None, 계층적 index 사용하려면 keys 튜플 입력
levels=None,
names=None, # index의 이름 부여하려면 names 튜플 입력
verify_integrity=False, # True : index 중복 확인
copy=True) # 복사
우선 DataFrame과 Series를 만들어보자
import pandas as pd
df1 = pd.DataFrame({'a' : ['a0', 'a1', '메롱', 'a3'],
'b' : ['b0', 'b1', 'b2', 'b3'],
'c' : ['c0', 'c1', 'c2', 'c3']},
index = [0, 1, 2, 3])
df2 = pd.DataFrame({'a' : ['a2', 'a3', 'a4', 'a5'],
'b' : ['b2', 'b3', 'b4', 'b5'],
'c' : ['c2', 'c3', 'c4', 'c5'],
'd' : ['d2', 'd3', 'd4', 'd5']},
index = [2, 3, 4, 5])
sr1 = pd.Series(['e0', 'e1', 'e2', 'e3'], name='sr1')
sr2 = pd.Series(['f0', 'f1', 'f2'], name='sr2', index=[3,4,5])
sr3 = pd.Series(['g0', 'g1', 'g2', 'g3'], name='sr3')
print(df1, '\n')
print(df2, '\n')
print(sr1, '\n')
print(sr2, '\n')
print(sr3)
>>>
a b c
0 a0 b0 c0
1 a1 b1 c1
2 메롱 b2 c2
3 a3 b3 c3
a b c d
2 a2 b2 c2 d2
3 a3 b3 c3 d3
4 a4 b4 c4 d4
5 a5 b5 c5 d5
0 e0
1 e1
2 e2
3 e3
Name: sr1, dtype: object
3 f0
4 f1
5 f2
Name: sr2, dtype: object
0 g0
1 g1
2 g2
3 g3
Name: sr3, dtype: object
1-1. pd.concat(axis=0)
pd.concat([df1, df2]) # 행방향으로 붙이기
1-2. pd.concat(axis=1)
pd.concat([df1, df2], axis=1) # 열방향으로 붙이기
default값으로 axis=0이 적용되기 때문에 행방향(상하)으로 DataFrame을 이어 붙인다. join의 default값은 outer를 가지기 때문에 각 DataFrame의 열의 수가 달라도 추가로 생기며 값이 없는 공간은 NaN값이 채워진다. 행도 그대로 이어붙인다. ignore_index=True로 인덱스를 재배열할 수도 있다.
1-3. pd.concat(axis=0, ignore_index=True)
pd.concat([df1, df2], ignore_index=True)
1-4. pd.concat(axis=1, ignore_index=True)
pd.concat([df1, df2], axis=1) # axis=1 옵션일 경우 인덱스 재배열시 행이 아닌 열 이름이 정수로 재배열
1-5. pd.concat(axis=0, join='inner')
pd.concat([df1, df2], join='inner')
1-6. pd.concat(axis=1, join='inner')
pd.concat([df1, df2], axis=1, join='inner')
1-7. pd.concat(Series + Series, axis=0)
Series 객체도 마찬가지로 붙이기가 가능하다. 시리즈 객체를 생성할 때 주는 옵션 name이 시리즈가 DataFrame에 결합되었을 때의 열 이름이 된다.
pd.concat([sr1, sr2])
>>>
0 e0
1 e1
2 e2
3 e3
3 f0
4 f1
5 f2
dtype: object
1-8. pd.concat(Series + Series, axis=1)
pd.concat([sr1, sr2], axis=1) # Series + Series의 결과로 DataFrame이 생성
1-9. pd.concat(DataFrame + Series, axis=0)
pd.concat([df1, sr1])
1-10. pd.concat(DataFrame + Series, axis=1)
pd.concat([df1, sr1])
1-10. pd.concat(keys=[''], axis=0)
pd.concat([df1, df2], keys=['A', 'B']) # 행에 계층적 인덱스 이름 부여
1-10. pd.concat(keys=[''], axis=1)
pd.concat([df1, df2], axis=1, keys=['A', 'B']) # 열에 계층적 인덱스 이름 부여
2. DataFrame 병합 : pd.merge()
merge() 메서드는 두 DataFrame을 각 데이터에 존재하는 고윳값(key)을 기준으로 병합할 때 사용한다.
※ merge() for combining data on common columns or indices
pd.merge(df_left, df_right, how='inner', on=None)이 default값이다.
pd.merge(left, right, # merge를 수행할 DataFrame 객체 이름
how='inner', # left, right, inner(default), outer
on=None, # merge의 기준이 되는 Key 변수
left_on=None # 왼쪽 DataFrame의 변수를 Key로 사용
right_on=None, # 오른쪽 DataFrame의 변수를 Key로 사용
left_index=False, # 만약 True일 경우, 왼쪽 DataFrame의 index를 merge Key로 사용
right_index=False, # 만약 True일 경우, 오른쪽 DataFrame의 index를 merge Key로 사용
sort=True, # merge된 후의 DataFrame을 join Key 기준으로 정렬
suffixes=('_x', '_y'), # 중복되는 변수 이름에 대해 접두사 부여(default값 : _x, _y)
copy=True, # merge할 DataFrame을 복사
indicator=False, # 병합된 이후의 DataFrame에 left_only, right_only, both등의 출처를
# 알 수 있는 부가 정보 변수 추가
2-1. pd.merge()
pd.merge(df1, df2) # 일반적으로 KEY는 1개지만 예시를 위해 설정하지 않고 동시에 3개의 컬럼을 겹쳐보았다.
어떠한 옵션도 적용하지 않으면, on=None이므로 두 데이터의 공통 열 이름을 기준으로 inner(교집합, default) 조인을 하게 된다. 위 DataFrame에서 두 DataFrame은 a, b, c가 공통 열이고 동시에 공통 키가 된다. 그리고 위의 두 DataFrame에서 공통 열 a, b, c에서 교집합인 데이터가 존재하는 행이 출력되고 하나라도 값이 다르면 다른 DataFrame에만 존재하는 열의 데이터와 매치가 되지 않기 때문에 해당 행은 출력이 되지 않는다. 만약 공통된 열이 존재하지 않으면 에러가 발생한다.
※ 보통은 DataFrame에서 겹치는 컬럼이 한 개이고, 그 한 개의 컬럼을 KEY로 설정한다.
2-2. pd.merge(how='outer')
pd.merge(df1, df2, how='outer')
2-3. pd.merge(on='')
pd.merge(df1, df2, on='b')
KEY를 b로 설정하였을 경우 각 DataFrame의 공통된 열 b에서 같은 데이터를 추출하고 그에 대응하는 값들이 출력된다. 그런데 a_x, a_y 처럼 a 컬럼이 두 개로 나누어져 있는 걸 볼 수 있는데 이는 KEY가 아닌 두 DataFrame의 같은 이름의 열을 나눈 것이다.
참고로 x는 , 좌측의 DataFrame 열이고 y는 우측의 DataFrame 열이다. 필자의 출력 값을 보면 중간에 '메롱' 단어가 있는데 이는 df1의 a컬럼의 값을 하나 변경한 것으로 같은 열이 두 개로 쪼개졌기 때문에 공통된 DataFrame의 열에서 하나의 데이터 값이 바뀌어도 행 전체가 삭제가 되지 않고 그대로 출력된 모습을 보여주기 위해 변경했다.
※ 일반적으로는 하나의 컬럼만 겹치고 그 컬럼을 KEY로 잡고 나머지 열은 겹치는 일이 거의 없을 것이다.
2-4. pd.merge(on='', how='outer')
pd.merge(df1, df2, how='outer', on='b')
위와 같이 outer 옵션은 합집합으로 전체를 출력하고, 어느 한쪽에라도 데이터가 없을경우 NaN값이 출력된다.
2-5. pd.merge(on='', how='left')
pd.merge(df1, df2, how='left', on='b')
2-6. pd.merge(on='', how='right')
pd.merge(df1, df2, on='b', how='right')
위와같이 left 옵션은 좌측의 DataFrame(df1)을 기준으로 합친다. KEY인 b열에서 데이터가 df1의 KEY값들만 전부 출력된 걸 볼 수 있을 것이다. 참고로 KEY를 지정해주지 않으면 다음과 같이 좌측의 DataFrame(df1)이 전부 출력되고 df2는 매칭이 되는 값만 출력되고 나머지는 NaN값이 출력된다.
2-7. pd.merge(how='left')
pd.merge(df1, df2, how='left')
2-8. pd.merge(how='right')
pd.merge(df1, df2, how='right')
2-9. pd.merge(how='left', left_on='', right_on='')
left_on, right_on 옵션은 두 DataFrame의 KEY 컬럼이 같은 데이터를 취급하지만 컬럼 이름이 다를 때 사용한다. 다음 예를 참고하자.
2-9. pd.merge(how='left', left_on='', right_on='')
위의 예시를 보면 df1(left)를 기준으로 DataFrame을 병합했으므로 df1의 값들은 전부 출력되는 걸 볼 수 있다. df2(right)의 기준으로 병합한 것도 한번 보자.
위와 같이 df2(right)를 기준으로 두 DataFrame을 병합하면 df2의 데이터는 전부 출력되고 df1은 df2의 KEY값과 매칭 되는 데이터만 출력되는 걸 볼 수 있다.
3. DataFrame 결합 : pd.join()
join 메서드는 merge() 메서드를 기반으로 만들어졌기 때문에 기본 작동방식이 비슷하다. 하지만 join()은 행 인덱스를 기준으로 결합한다는 점에서 차이가 있다.
merge는 원하는 column을 기준으로 합칠 수 있지만 하나하나 설정을 해줘야 하는 부분이 있고 join은 인덱스의 기준을 움직여서 인덱스 설정이 잘 되어있다면 한결 편하게 작업을 할 수 있다.
다음은 join() 메서드의 옵션들이다. default값은 DataFrame1.join(DataFrame2, how='left')
※ join() for combining data on a key column or an index
※ column의 이름이 같을 경우 꼭 lsuffix, rsuffix 옵션에 이름을 부여해야 한다.
DataFrame.join(other, on=None, how='left', lsuffix='', rsuffix='', sort=False)
Parameters
Parameter | Value | Description |
other | Required. A DataFrame, a Series or a list of Data Frames. | |
on | String List |
Optional. Specifies in what level to do the joining |
how | 'left' 'right' 'outer' 'inner' |
Optional. Default 'left'. Specifies which index to use |
lsuffix | String | Optional. Default '', Specifies a string to add for overlapping columns |
rsuffix | String | Optional. Default '', Specifies a string to add for overlapping columns |
sort | True False |
Optional. Default False. Species whether to sort the DataFrame by the join key or not |
3-1. DataFrame.join()
df1.join(df2, lsuffix='_left', rsuffix='_right') # df1, df2 컬럼 이름이 같을 경우 suffix 이름 부여
3-2. DataFrame.join(how='right')
df1.join(df2, lsuffix='_left', rsuffix='_right', how='right')
3-3. DataFrame.join(how='inner')
df1.join(df2, lsuffix='_left', rsuffix='_right', how='inner')
3-4. DataFrame.join(how='outer')
df1.join(df2, lsuffix='_left', rsuffix='_right', how='outer')
3-5. DataFrame.set_index('').join(other.set_index(''))
df1.set_index('a').join(df2.set_index('a'), lsuffix='l', rsuffix='r')
3-6. DataFrame.set_index('').join(other.set_index(''), how='right')
df1.set_index('a').join(df2.set_index('a'), lsuffix='l', rsuffix='r', how='right')
join, merge 메서드는 DataFrame에 set_index를 지정해서 원하는 column을 index로 만들 수 있다. 참고로 두 DataFrame 모두 같은 column을 index로 지정해줘야 한다. 한쪽만 지정하면 적용되지 않는다.
# 아래의 두 결과는 같다.
df1.set_index('a').join(df2.set_index('a'), lsuffix='l', rsuffix='r', how='right')
pd.merge(df1.set_index('a'), df2.set_index('a'), suffixes=('l', 'r'), on='a', how='right')
Types of Join
지금까지 concat, merge, join 세 방법을 활용한 DataFrame 간 결합에 대해 포스팅했는데 DataFrame 결합은 데이터 전처리할때 자주 사용하는 거라 항상 써왔지만 이번에 글을 정리하면서 느낀 건 세 방법의 활용이 목적에 따라 전부 다르고 어떤 method를 사용하느냐에 따라 결과도 달라진다는 것이다.
물론 DataFrame의 형태에 따라서 같아질 수도 있지만 목적에 따라 대부분 다르게 사용하고 특히 세 개의 method마다 옵션들도 달라서 제대로 알고 사용해야 한다. 자칫 잘못하다간 DataFrame이 원하는 방향과 다르게 결합되고 이를 눈치채지 못하면 분석하는데 치명적인 영향을 끼칠 수 있기 때문이다.
출처 : https://programmerpsy.tistory.com/17
[Pandas 기초]4.여러 DataFrame 연결하기(Join)
안녕하세요. PSYda 입니다. 이번 포스팅에서는 두 개의 DataFrame을 연결하는 Join 기법에 대해 알아보겠습니다. 소개할 내용은 아래와 같습니다. 컬럼 기준 Join Index 기준 Join 행기준 Join Inner, Left, Right
programmerpsy.tistory.com
출처 : https://yganalyst.github.io/data_handling/Pd_12/
[Pandas 기초] 데이터프레임 합치기(merge, join, concat)
판다스 데이터프레임을 병합하는 여러가지 함수에 대해 알아보자
yganalyst.github.io
출처 : https://rfriend.tistory.com/258
[Python pandas] Database처럼 DataFrame Join/Merge 하기 : pd.merge()
데이터 분석을 하다 보면 여기 저기 흩어져 있는 데이터를 특정한 Key를 기준으로 병합해서 분석해야 하는 경우가 매우 많습니다. 지난번 포스팅에서는 DataFrame을 pandas의 concat() 함수를 이용해서
rfriend.tistory.com
출처 : https://rfriend.tistory.com/257
[Python pandas] DataFrame과 Series 합치기 : pd.concat(), append()
지난번 포스팅에서는 DataFrame을 Python pandas 라이브러리의 pd.concat() 함수를 사용해서 상+하로 합치기, 좌+우로 합치기를 해보았습니다. 이번 포스팅에서는 이어서 DataFrame과 Series를 pd.concat() 함수,..
rfriend.tistory.com
출처 : https://ahnty0122.tistory.com/51
[Python] Pandas dataframe 결합, 조인, 병합(Join, Merge)
Join 1. 예시 데이터프레임 생성 import pandas as pd df = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3', 'K4', 'K5'], 'A': ['A0', 'A1', 'A2', 'A3', 'A4', 'A5']}) other = pd.DataFrame({'key': ['K0', 'K1..
ahnty0122.tistory.com
출처 : https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.join.html
pandas.DataFrame.join — pandas 1.4.4 documentation
previous pandas.DataFrame.itertuples
pandas.pydata.org
출처 : https://www.w3schools.com/python/pandas/ref_df_join.asp
Pandas DataFrame join() Method
W3Schools offers free online tutorials, references and exercises in all the major languages of the web. Covering popular subjects like HTML, CSS, JavaScript, Python, SQL, Java, and many, many more.
www.w3schools.com
출처 : https://realpython.com/pandas-merge-join-and-concat/
Combining Data in Pandas With merge(), .join(), and concat() – Real Python
In this step-by-step tutorial, you'll learn three techniques for combining data in pandas: merge(), .join(), and concat(). Combining Series and DataFrame objects in pandas is a powerful way to gain new insights into your data.
realpython.com
출처 : https://rfriend.tistory.com/256?category=675917
[Python pandas] 여러개의 동일한 형태 DataFrame 합치기 : pd.concat()
분석을 하다보면 여기저기 흩어져 있는 여러 개의 데이터 테이블을 모아서 합쳐야 하는 일이 생기곤 합니다. 나를 대신해서 누군가가 데이터 전처리를 해주지 않는다고 했을 때는 말이지요. 정
rfriend.tistory.com
Pandas join issue: columns overlap but no suffix specified
I have the following data frames: print(df_a) mukey DI PI 0 100000 35 14 1 1000005 44 14 2 1000006 44 14 3 1000007 43 13 4 1000008 43 13 print(df_b) mukey niccdcd 0 19...
stackoverflow.com
'프로그래밍 언어 > Python' 카테고리의 다른 글
Python_에러 종류 (0) | 2022.09.24 |
---|---|
Python_예외처리(try, except, else, finally) (0) | 2022.09.23 |
Python_DataFrame 데이터 타입 확인 및 변경 (0) | 2022.09.08 |
Python_DataFrame 특정 값의 고윳값 종류 및 갯수 구하기 (0) | 2022.09.08 |
Python_DataFrame Column별 데이터 수 출력 (0) | 2022.09.08 |