빅데이터 전문가 되기

[DataFrame] merge( ) vs concat( ) 본문

Python

[DataFrame] merge( ) vs concat( )

지야소이 2023. 4. 27. 12:41

👀 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
Comments