빅데이터 전문가 되기
[DataFrame] merge( ) vs concat( ) 본문
👀 merge( ) 란?
:공통의 열을 기준으로 두 데이터 프레임을 합쳐주므로 나머지 열까지 조인하고 싶을 때 편리하게 사용할 수 있습니다.
import pandas as pd
# df1, df2의 열 이름이 같을 때
pd.merge(df1, df2, on = '공통열', how = '조인방식')
# df1, df2의 열 이름이 다를 때
df1.merge(df2, left_on= 'df1의 공통컬럼명', rigth_on= 'df2의 공통컬럼명', how = '조인방식')
how [default = 'inner'] : 조인 방식으로는 'left', 'right', 'inner', 'outer' 이 있음.
예시 데이터를 통하여 이해하겠습니다.
fruit = pd.DataFrame({'Num':[123, 456, 789, 1011, 1112], 'Fruit':['Apple','Banana','Cherry','Lemon','Peach']})
grade = pd.DataFrame({'Num':[123, 789, 1314], 'Grade': ['A', 'B', 'C']})
Fruit 데이터와 Grade 데이터를 Num을 기준으로 합쳐보겠습니다.
😄 Join 방식에 따른 결과
👉 Left Join
: 왼쪽 데이터 프레임을 기준으로 join하며, 오른쪽 데이터 프레임에 없는 값은 NaN으로 나타냅니다.
pd.merge(fruit, grade, on ='Num', how='left')
👉 Right Join
: 오른쪽 데이터 프레임을 기준으로 join하며, 왼쪽 데이터 프레임에 없는 값은 NaN으로 나타냅니다.
pd.merge(fruit, grade, on ='Num', how='right')
👉 lnner Join
: 두 데이터 프레임에서 교집합만 join합니다.
pd.merge(fruit, grade, on ='Num', how='inner')
👉 Outer Join
: 두 데이터 프레임의 모든 값을 join하며, 없는 값들은 NaN으로 나타냅니다.
pd.merge(fruit, grade, on ='Num', how='outer')
😄 기준 열에 따른 결과
👉 공통되는 기준 열이 여러 개일 때
pd.merage(left, right, on = ['X', 'Y'])
on에 대해 공통되는 기준열 2개를 리스트형식으로 입력합니다.
👉 두 데이터 프레임의 열 이름이 다를 때
fruit.merge(grade, left_on ='Fruit', right_on='Grade', how='outer')
-> 행을 기준으로 합쳐지고, 나머지값은 NaN으로 채워진 것을 확인할 수 있습니다.
👀 Concat( ) 란?
: 데이터 프레임을 말그대로 물리적으로 이어 붙여주는 함수입니다.
pd.concat([df1,df2,df3,..], axis=0, ignore_index=False, join='outer')
df1, df2의 자리는 데이터프레임 형태여야 하며, 합집합 형태로 데이터를 묶어야 할 때 사용하면 편합니다.
default 값은[ axis = 0 (row-bind) / 인덱스 초기화 x / outer join ]
import pandas as pd
# df1: 1반 학생들(3명)의 시험 성적
a = [100, 66, 80, 97]
b = [26, 54, 56, 100]
c = [99, 46, 72, 33]
df1 = pd.DataFrame([a,b,c], columns=['Korean','Math','English','Science'])
df1
# df2: 2반 학생들(3명)의 시험 성적
a = [88, 94, 21, 45]
b = [89, 46, 28, 77]
c = [20, 56, 84, 90]
df2 = pd.DataFrame([a,b,c], columns=['Korean','Math','English','Science'])
df2
# df3: 3반 학생들(3명)의 시험 성적
a = [39, 18, 20, 72]
b = [47, 98, 50, 100]
c = [62, 79, 65, 81]
df3 = pd.DataFrame([a,b,c], columns=['Korean','Math', 'English','Science'])
df3
< df1 > < df2 > < df3 >
디폴트 값으로 3개 데이터프레임을 묶어보겠습니다.
pd.concat([df1, df2, df3])
-> 행과 행이 쌓이는 형태로 왼쪽 인덱스를 보면 기본 인덱스가 남아있다는 것을 볼 수 있습니다.
pd.concat([df1,df2,df3], ignore_index =True)
-> ignore_index를 True로 두게 되면 인덱스번호가 초기화되어 0부터 순서대로 값이 매겨집니다.
pd.concat([df1,df2,df3], axis =1)
-> axis = 1일 때는 열의 형태로 합쳐지는 것을 확인할 수 있습니다.
pd.concat([df1,df2,df3], axis =1, ignore_index=True)
-> 인덱스 값이 위에 0부터 생성된 것을 확인할 수 있습니다.
# 디폴트는 outer join으로 겹치는 값 상관없이 모두 join 함.
# 겹치는 값만 뽑으면 열 이름이 같으므로 전부 뽑힌다.
pd.concat([df1, df2, df3], join = 'inner')
-> 인덱스 값이나 컬럼 값이 꼭 겹치지 않아도 모든 데이터를 붙여서 반환합니다.
이 데이터에서는 axis =0에서 컬럼 값이 모두 동일하므로 inner join이나 outer join을 쓰나 똑같습니다.
만일, outer와 inner join의 차이를 보고 싶으면 열 이름을 바꿔 join 해봅시다.
df1.columns =['A','B','C','D']
df2.columns =['A','E','F','D']
pd.concat([df1,df2], join='inner')
-> inner join을 했을 때는 공통 열만 추출되는 것을 확인 할 수 있습니다.
pd.concat([df1,df2], join='outer')
-> outer join은 공통 열이 아니더라도 전부 추출되며 겹치지 않는 부분은 NaN으로 표시되는 것을 확인할 수 있습니다.
👉 pd.concat의 기능
: concat은 인덱싱을 할 때 유용합니다.
new_df = pd.concat([df1,df2,df3])
new_df
-> df1, df2, df3를 묶어 새로운 데이터 프레임 new_df를 만들었습니다.
# 행 값이 1인 것만 추출 (인덱스가 1인 값 모두)
new_df.loc[1,]
# 딱 1행만 추출
new_df.iloc[1, ]
이 때, 한 명의 성적을 누락시켜 추가해주려고 합니다.
이 때는 데이터프레임 형태로 concat을 해줘도 되지만, append를 해줘도 됩니다.
또한, 딕셔너리 형태로 append하는 것도 가능합니다.
# 컬럼이 여러개이면 Series가 아닌 DataFrame으로 바꿔줌.
df4 = pd.DataFrame([[47,82,88,76]], columns=['Korean','Math','English','Science'])
pd.concat([new_df, df4])
-> 이 때 주의할 점은 df4 값을 쓸 때는 컬럼 값을 꼭 넣어줘야 합니다.
concat의 디폴트는 열을 기준으로 묶어 주기 때문입니다.
혹은, 딕셔너리로 append 해줄 수도 있습니다.
dict4 = dict({'Korean': 47, 'Math': 82, 'English':88, 'Science':76})
new_df.append(dict4)
> TypeError: Can only append a dict if ignore_index=True
이 경우 TyeError가 뜨게 되는데, 데이터 프레임에서 딕셔너리로 하는 경우에는 ignore_index=True를 해줘야 합니다.
new_df.append(dict4, ignore_index=True)
'Python' 카테고리의 다른 글
Google Bigquery 데이터 적재 (0) | 2023.06.21 |
---|---|
공공데이터 API 크롤링 (0) | 2023.06.21 |
Warnings(경고 제어) (0) | 2023.04.27 |
Selenium 라이브러리 (0) | 2023.04.18 |
라이브러리 자료모음 (0) | 2023.04.14 |