AICE - 기초데이터4

이강민·2023년 8월 2일
0

AICE

목록 보기
5/18
post-thumbnail

데이터프레임 병합

concat 활용하여 병합

칼럼명이 같은 경우

# 두 데이터프레임을 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)

  • axis = 0 : 행 레벨로 병합
  • axis = 1 : 칼럼 레벨로 병합
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 옵션을 이용하여 병합

  • outer : 합집합 방식
  • inner : 교집합 방식

pd.concat([df1,df2], join='inner')

df2의 col3는 df1과 교차하는 데이터가 없기 때문에 생략되었다.

인덱스가 중복인 경우

인덱스가 중복을 확인하는 메서드는 verify_integrity 속성을 사용한다.

pd.concat([df1,df2], verify_integrity=True)

인덱스가 중복으로 에러 메시지를 리턴한다.

merge/join 활용하여 병합

특정한 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']]
profile
배움은 끝없이

0개의 댓글