# 두 데이터프레임을 concat을 이용하여 병합
import pandas as pd
import numpy as np
df1 = pd.DataFrame({
'col1':['사과','배','감','수박','메론'],
'col2':[500,11000,2500,5000,3000],
}, index = [0,1,2,3,4])
df2 = pd.DataFrame({
'col1':['수박','멜론','딸기','키위','오렌지'],
'col2':[5000,3000,1000,600,700]
},index=[3,4,5,6,7])
#ignore_index를 False로 하면 기존 데이터프레임의 index를 따라간다.
pd.concat([df1,df2], ignore_index=False)
ignore_index가 True일 경우
pd.concat([df1,df2], ignore_index=True)
pd.concat([df1,df2], ignore_index=True, axis=1)
import pandas as pd
import numpy as np
df1 = pd.DataFrame({
'col1':['사과','배','감','수박','메론'],
'col2':[500,11000,2500,5000,3000],
}, index = [0,1,2,3,4])
df2 = pd.DataFrame({
'col1':['수박','멜론','딸기','키위','오렌지'],
'col2':[5000,3000,1000,600,700],
'col3': [2,3,4,5,6]
},index=[3,4,5,6,7])
pd.concat([df1,df2], join='outer')
join 옵션을 이용하여 병합
pd.concat([df1,df2], join='inner')
df2의 col3는 df1과 교차하는 데이터가 없기 때문에 생략되었다.
인덱스가 중복을 확인하는 메서드는 verify_integrity 속성을 사용한다.
pd.concat([df1,df2], verify_integrity=True)
인덱스가 중복으로 에러 메시지를 리턴한다.
특정한 key를 기준으로 데이터프레임을 병합할 때 사용한다.
데이터 세팅
import pandas as pd
import numpy as np
customer = pd.DataFrame({
'customer_id': np.arange(6),
'name':['James','Elly','Tom','Givert','Aiden','Brody'],
'age' : [30,20,34,24,26,21]
})
orders = pd.DataFrame({
'customer_id':[1,1,2,2,2,3,3,1,4,9],
'item':['마우스','충전기','이어폰','헤드셋','전자펜','키보드','전자펜','마우스','키보드','케이스'],
'quantity':[1,2,1,1,3,2,2,3,2,1]
})
customer
orders
customer_id를 기준으로 두 데이터프레임 병합
pd.merge(customer, orders, on='customer_id')
default 옵션으로 inner이며 병합 방식은 how키워드를 이용한다.
좌측 기준으로 데이터를 병합하면 customer를 기준으로 병합할 수 있다.
pd.merge(customer, orders, on='customer_id', how='left')
right를 기준으로 병합하면 orders를 기준으로 병합한다.
pd.merge(customer, orders, on='customer_id', how='right')
orders 데이터프레임에는 customer_id 0과 5가 없기때문에 병합되지 않았다.
outer 방식을 통해 모든 데이터를 병합할 수 있다.
pd.merge(customer, orders, on='customer_id', how='outer')
데이터프레임 각각 인덱스를 지정하여 병합할 수도 있다.
또한 left_index옵션과 right_index옵션을 이용하여 on을 사용하지 않고 inner 병합을 할 수있다.
pd.merge(cust1, order1, left_index=True, right_index=True)
Q1. 데이터프레임 병합하여 customer, orders 에서 가장 많이 팔린 아이템은?
#orders의 item의 quantity 합을 구해야한다.
#병합된 테이블에서 item으로 그룹하여 합계를 구하면 된다.
pd.merge(customer, orders, on='customer_id', how="right")
.groupby(['item'])
.sum()
.sort_values(by='quantity', ascending=False)
Q2. Elly가 가장 많이 구매한 물건은 무엇인가요?
# customer 데이터프레임 기준으로 name과 item을 그룹하여 이름 별 item을 구하고
# item의 갯수를 구하는데 name이 Elly인 데이터만 검색
pd.merge(customer, orders, on='customer_id', how="left")
.groupby(['name', 'item'])
.sum()
.loc[['Elly']]