: 두개 이상의 DataFrame을 합쳐 하나의 DataFrame 으로 만들기
→ SQL에서의 union이나 join이라고 볼 수 있음
! 관리는 나눠서 하고, 분석은 합쳐서 하는것이 효과적
from glob import glob
: 특정 디렉토리 안의 파일들의 경로를 조회
## 파일명 : * : 0개 이상의 모든 글자
## 디렉토리 : ** 모든 하위 디렉토리
"data/*.csv" # data 디렉토리 바로 아래에 있는 파일들 중 확장자가 csv인 파일들의 경로 (하위까진 찾지 않음)
"data/*/.csv" # 데이터 디렉토리 + 하위 디렉토리에 있는 모든 csv 를 다 찾아보라는 위미
ex)
[pd.read_csv(file) for file in glob("data/stock*.csv")]
: 수직 결합, 수평 결합 모두 지원
→ 하나의 데이터셋을 여러 DataFrame으로 나눈 것을 하나의 DataFrame으로 합칠 때 사용
pd.concat(objs, [, key=리스트]), axis=0, join='outer' )
objs
: 합칠 DataFrame들을 리스트로 전달keys=[]
를 이용해 합친 행들을 구분하기 위한 다중 인덱스 처리
- 0 또는 index : 수직결합
- 1 또는 columns : 수평결합
ex)
stock_2016, stock_2017, stock_2018 라는 3개의 stcok 데이터가 있다고 가정할 떄 이를 하나의 데이터에 표기하려면
stocks = pd.concat([stock_2016, stock_2017, stock_2018])
stocks.shape
stocks2 = stocks = pd.concat([stock_2016, stock_2017, stock_2018],
ignore_index = True
)
stocks2
→ ignore_index = True : index 이름은 합칠 때 무시해라
stocks3 = stocks = pd.concat([stock_2016, stock_2017, stock_2018],
keys = ["2016년", "2017년", "2018년"]
stocks3
→ 각 DataFrame 을 구분할 수 있는 index를 추가
→ Multi index => 2016년이라는 한 index에 대하여 행이 3개 존재
+@
stocks3.loc[('2016년', 0)]
level 0 , level 1 묶어서 조회 → 튜플로 묶어서 전달 (이때 level 0이 기준)
stocks3.loc[['2016년', '2018년']]
index으로 조회
multi index를 조회할 때에는
xs
를 사용하면 자유롭게 조회 가능
ex)
# multi index 햏/컬럼을 조회하는 method
stocks3.xs(0, #조회할 컬럼/ 행 이름
axis = 0, # 0: 행 조회, 1: 열조회
level = 1 # 조회할 이름의 level 위치
)
조인(join)
- 여러 데이터프레임에 흩어져 있는 정보 중 필요한 정보만 모아서 결합하기 위한 것
- 두개 이상의 데이터프레임을 특정 컬럼(열)의 값이 같은 행 끼리 수평 결합하는 것
- Inner Join, Left Outer Join, Right Outer Join, Full Outer Join
dataframe객체.join(others, how='left', lsuffix='', rsuffix='')
df_A.join(df_b)
, df_A.join([df_b, df_c, df_d])
Left Outer Join
매개변수
lsuffix, rsuffix
→ 조인 대상 DataFrame에 같은 이름의 컬럼이 있으면 에러 발생
→ 같은 이름이 있는 경우 붙일 접미어 지정
> **how : 조인방식**
>'left', 'right', 'outer', 'inner'. left가 기본
stock_info.join(stock_2016, lsuffix = 'info')
#stock_info : Symbpl
#Stock_2018 : Symbol
## Symbol을 index으로 변경
join_result1 = stock_info.set_index("Symbol").join(stock_2018.set_index("Symbol"))
join_result1
join_result2 = stock_info.set_index("Symbol").join(stock_2018.set_index("Symbol"),
how = 'right')
join_result2
이는 right join 한 상태를 보여주는데 이때, right 대신 inner도 사용 가능함
stock_2016.add_suffix("_2016")
이 코드는 컬럼명 뒤에 접미어를 붙여줌. 이때 붙는 접미어는 전체적으로 모든 column명 뒤에 붙게됨. 그리고 add_suffix()
대신 add_preffix()
을 사용하면 접미사 대신 접두사를 붙여줌
df_a.merge(df_b)
두개의 DataFrame간의 조인만 가능
조인 기준
- 같은 컬럼명을 기준으로 equi-join을 하는 것이 기본
- 조인기준을 다양하게 정할 수 있다.
- 컬럼, index등을 기준으로 같은 행끼리 join 하도록 설정 가능
dataframe.merge(합칠dataframe, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False)
ex)
stock_info.merge(stock_2016)
아래의 경우에는 같은 이름의 column명을 기준으로 join시킨 것
stock_info.merge(stock_2016,
how = 'left'
)
이때 default 값은 inner join
stock_info.merge(stock2016
, left_on = "Symbol"
, right_index = True
)
이때 left_on = "Symbol"
는 왼쪽 DF(stock_info)의 join 컬럼을 지정한 것이고 right_index = True
는 오른쪽 DF(stock2016)의 index를 join의 기준으로 사용한 것
하나의 데이터셋을 어떤 특정행 또튼 특정열을 기준으로 단순해 분리 한 경우를 합치는 경우 concat() 사용
수직 결합일 경우는 concat()을 사용해야 한다.
서로 연관성 있는 다른 데이터셋을 결합해서 보는 경우 join(), merge()를 사용한다. (Join)
두 개 이상의 DataFrame을 조인할 때는 하는 경우 : join() 사용
두개의 DataFrame을 조인할 때는 merge() 를 사용한다. => 컨트롤이 편하다.
ex)
import pandas as pd
# 1 data/customer.csv, data/order.csv, data/qna.csv 를 DataFrame으로 읽으시오.
file_names = ["customer", "order", "qna"]
customer, order, qna = [pd.read_csv(f"data/{name}.csv") for name in file_names]
customer.shape, order.shape, qna.shape
# 2 TODO1에서 읽은 세개의 데이터셋의 정보를 확인하세요.
print(customer.columns)
print(order.columns)
print(qna.columns)
# 3 customer DataFrame과 order DataFrame을 고객정보는 모두 나오도록 join 하세요.
result = customer.merge(order, left_on = "id", right_on = "cust_id", how = 'left').drop(columns = 'cust_id')
result
# 4 customer DataFrame의 index를 id컬럼으로 변경.
customer.set_index('id', inplace = True)
customer
# 5 4에서 만든 customer DataFrame과 qna DataFrame을 inner join 하세요.
## join() 사용 - index name 기
customer.join(qna.set_index('cust_id'), how = "inner")
##merge()
customer.merge(qna, left_index=True, right_on = "cust_id", how = "inner")
# 6. 세개의 DataFrame을 고객정보는 모두 나오도록 join 하세요.
customer.join([order.set_index('cust_id'),
qna.set_index('cust_id')]
, how = 'left')