|Playdata_study/Python
210723_Concat,Merge
케리's
2021. 7. 24. 18:42
DataFrame - 데이터 병합
- Concat
단순히 하나의 DataFrame에 다른 DataFrame 을 연속적으로 붙이는 방법
이 경우에는 두 DataFrame 이 서로 동일한 인덱스, 컬럼을 가지고 있는 경우가 대부분이다.
위, 아래로 연결되는 방식이 기본이지만 좌, 우 연결도 가능하다.
outer join이 기본으로 동작
key를 이용한 Concat 활용해서 사용한다.
- Merge
두 개의 DataFrame을 병합.
좌, 우로 연결되는 방식이 기본.
inner join이 기본으로 동작
on을 이용해 Merge 활용해서 사용한다.
pandas 의 concat
import numpy as np
import pandas as pd
from pandas import DataFrame, Series
import matplotlib.pyplot as plt
df1 = DataFrame({
'A':['A0','A1','A2','A3'],
'B':['B0','B1','B2','B3'],
'C':['C0','C1','C2','C3'],
'D':['D0','D1','D2','D3'],
})
df1
df2 = pd.DataFrame({
'A':['A4', 'A5', 'A6', 'A7'],
'B':['B4', 'B5', 'B6', 'B7'],
'C':['C4', 'C5', 'C6', 'C7'],
'D':['D4', 'D5', 'D6', 'D7'],
})
df2
# concat ([]) : 위 DataFrame 을 합쳐보자
'''
df1, df2 데이터를 가만히 보자
어떻게 병합하는게 좋을까?
--> 상하 연결
--> pandas 에서 제공하는 함수 concat()
:: 결과를 확인하면
인덱스가 0,1,2,3,0,1,2,3
동일한 인덱스 값이 그대로 반복되어져 있다.
ignore_index = True 옵션을 지정한다.
'''
result1 = pd.concat([df1,df2])
result1
# 좌우병합 : axis = 1
# 컬럼명 인덱스로 대체 : ignore_index = True
# 좌우 병합은? axis = 1
# ignore_index = True 지정, 해당 컬럼명이 인덱스로 대체된다.
result1 = pd.concat([df1, df2], axis = 1, ignore_index=True) # 행이아닌 열로 합쳐진다
result1
result1 = pd.concat([df1, df2], axis = 1) # 행이아닌 열로 합쳐진다
result1
# Keys
result1 = pd.concat([df1,df2], keys=['X','Y'])
result1
df3 = DataFrame({
'A':['A0','A1','A2','A3'],
'B':['B0','B1','B2','B3'],
'C':['C0','C1','C2','C3']
})
df3
df4 = pd.DataFrame({
'A':['A4', 'A5', 'A6', 'A7'],
'B':['B4', 'B5', 'B6', 'B7'],
'C':['C4', 'C5', 'C6', 'C7'],
'D':['D4', 'D5', 'D6', 'D7'],
})
df4
# outerjoin
: join 시 없는 데이터에 누락데이터를 만들어서 병합
'''
위 df3, df4 데이터는 행과 열 인덱스가 일치하지 않는 데이터 프레임이다.
axis = 0 을 기준으로 병합 하기 때문에 concat은 상하로 데이터를 이어 붙이게 될 것이다.
어떤 현상이 발생할까?
join시 없는 데이터에
누락데이터가 만들어서 병합된다 = outerjoin
'''
result2 = pd.concat([df3, df4], ignore_index=True) # join= 'outer' 가 디폴트
result2
# innerjoin
: join 시 둘다 가지고 있는 컬럼값 (행 인덱스) 만 가져온다
result3 = pd.concat([df3, df4], ignore_index=True, join='inner')
result3 # 둘다 가지고 있는 컬럼값(행 인덱스)만 가져온다 = innerjoin
Pandas 의 Merge
'''
df1, df2 는 인덱스만 다를 뿐 모든 값을 동일하게 가지고 있다.
df3 Color_num 이라는 다른컬럼을 모두 가지고 있다.
'''
df1 = DataFrame({ 'Year':[2001,2002,2003,2004],
'Product_Code':[11,22,33,44],
'Price':[10000,20000,30000,40000]},
index=list('1234'))
df1
df2 = DataFrame({ 'Year':[2001,2002,2003,2004],
'Product_Code':[11,22,33,44],
'Price':[10000,20000,30000,40000]},
index=list('5678'))
df2
df3 = DataFrame({ 'Year':[2001,2003,2004,2005],
'Product_Code':[11,22,33,44],
'Color_num':[33,44,55,99]},
index=list('1234'))
df3
# df1, df2 를 merge
# df1, df2 를 merge
# 1.표현법이 concat과 다르다, [] 들어가지 않는다
# 2.인덱스와 상관없이 병합되고 (+좌우병합) 값 들은 중복 표기되지 않는다. (동일하다면)
result1 = pd.merge(df1,df2)
result1
# df1_1 과 df1을 merge
# df1_1 과 df1을 merge
df1_1 = DataFrame({ 'Year':[2001,2002,2003,2004],
'Product_Code':[11,22,33,44],
'Price':[1,2,3,4]},
index=list('1234'))
result2 = pd.merge(df1,df1_1)
result2 # 결과가 나오지 않는다, 그렇기 때문에 'on'을 사용해야한다.
# merge 할때는 주로 특정한 컬럼을 기준으로 병합을 한다.
# 기준이 되는 컬럼 외에는 다 중복으로 데이터가 표기된다.
# on : 병합할 때 기준이 되는 컬럼을 지정
result2 = pd.merge(df1,df1_1, on = 'Year')
result2
result3 = pd.merge(df1, df1_1, on = ['Year','Product_Code'])
result3
set_index()
특정한 컬럼을 인덱스로 지정함으로써
데이터 프레임을 좀 더 깔끔하고 직관적으로 디스플레이 할 수 있다.
result3.set_index('Year', inplace=True)
result3
# 문제1 df1 과 df3 을 merge
# Year를 기준으로 병합
# Year를 기준으로 병합
result3 = pd.merge(df1, df3, on = 'Year')
result3
# how = 'outer'
# how 옵션이 있다. 어떻게 merge할 것인가? join과 동일한 옵션
# 여기서 inner가 디폴트이다.
result4 = pd.merge(df1, df3, on = 'Year', how = 'outer')
result4
result5 = pd.merge(df1, df3, on = 'Year', how = 'inner') # 디폴트
result5
result6 = pd.merge(df1, df3, on = 'Year', how = 'left') # df1 컬럼위주로 병합
result6
result7 = pd.merge(df1, df3, on = 'Year', how = 'right') # df3 컬럼위주로 병합
result7