IT 동아리에서 pandas를 활용한 30일 챌린지 링크를 보고, 매일 문제를 풀고 리뷰하게 되었다. 문제를 보니 SQL문으로도 접근할 수 있어 보였기 때문에 python과 sql문 2가지 solution을 제작해보았다.
Big Countries
다음 테이블에서 면적이 3백만 이상이거나, 인구가 2500만명 이상인 나라의 이름, 인구, 면적을 구하시오.

Pandas
result_print(World[(World['area'] > 3000000) | (World['population'] > 25000000)][['name','population','area']].reset_index(drop=True))
- World['area'] > 3000000: 'area' 열의 값이 3,000,000보다 큰 행을 선택한다.
- World['population'] > 25000000: 'population' 열의 값이 25,000,000보다 큰 행을 선택한다
- (World['area'] > 3000000) | (World['population'] > 25000000): 두 조건 중 하나라도 참인 행을 선택한다. '|'는 '또는(or)'을 의미한다.
- [['name','population','area']]: 세 개의 열만 선택한다.
- reset_index(drop=True): 행 인덱스를 리셋한다. 기존의 인덱스를 드롭하고, 새로운 기본 인덱스를 생성한다.
SQL
select name, population, area
from World
where area > 3000000 or population > 25000000
- select name, population, area: 테이블에서 'name', 'population', 'area' 세 열만 선택한다.
- from World: World 테이블에서 데이터를 선택한다.
- where area > 3000000 or population > 25000000: 'area' 값이 3,000,000보다 크거나 'population' 값이 25,000,000보다 큰 행만 선택하라는 조건이다.
Recyclable and Low Fat Products
다음 테이블에서 저지방이면서 재활용이 가능한 제품의 ID를 구하시오.

Pandas
result_print(Products[(Products['low_fats']=='Y')&(Products['recyclable']=='Y')][['product_id']])
- (Products['low_fats']=='Y')&(Products['recyclable']=='Y'): 'low_fats'와 'recyclable' 열의 값이 모두 참인 행만 선택합니다. '&'는 '그리고(and)'를 의미한다.
- [['product_id']]: 테이블에서 'product_id' 열만 선택한다.
SQL
select product_id
from Products
where low_fats = 'Y' and recyclable = 'Y'
- select product_id: 'product_id' 열만 선택하라는 의미한다.
- from Products: Products 테이블에서 데이터를 선택하라는 의미한다.
- where low_fats = 'Y' and recyclable = 'Y': 'low_fats' 값이 'Y'이고 'recyclable' 값이 'Y'인 행만 선택하라는 조건이다.
Customers Who Never Order
다음 2개의 테이블을 보고, 주문을 하지 않은 고객의 이름을 출력하시오.

Python
df = pd.merge(Customers, Orders, left_on= 'id', right_on = 'customerId',how = 'left')
new_df = df[df['customerId'].isnull()]['name'].reset_index(drop = True).to_frame()
print(new_df.rename(columns={'name':'Customers'}))
- pd.merge(): 두 DataFrame을 병합하는 함수이다.
- left_on= 'id': 'Customers' DataFrame의 'id' 열을 기준으로 병합한다.
- right_on= 'customerId': 'Orders' DataFrame의 'customerId' 열을 기준으로 병합한다.
- how = 'left': 왼쪽 DataFrame('Customers')에 있는 모든 행을 포함하며, 오른쪽 DataFrame('Orders')에서 일치하는 행만 포함하라는 의미입니다. 일치하지 않는 행에는 NaN 값이 삽입된다.
- df['customerId'].isnull(): 'customerId' 열의 값이 NaN인 행만 선택한다.
- to_frame(): Series를 DataFrame으로 변환한다.
- rename(): 열 이름을 변경한다. 여기서는 'name' 열의 이름을 'Customers'로 변경하고 있다.
SQL
select name as Customers
from Customers
left join Orders
on Customers.id = Orders.customerId
where customerId is null
- select name as Customers: 'name' 열을 선택하며, 결과 출력에서는 'Customers'라는 이름으로 표시하라는 의미한다.
- left join Orders: 'Customers' 테이블의 모든 행과 'Orders' 테이블에서 일치하는 행만 결합하고, 일치하지 않는 행에는 NULL 값이 들어간다.
- on Customers.id = Orders.customerId: 두 테이블을 어떻게 결합할지를 지정하는 조건이다. 'Customers' 테이블의 'id' 열과 'Orders' 테이블의 'customerId' 열이 일치하는 경우에 결합한다.
- where customerId is null: 'customerId' 열의 값이 NULL인 행만 선택하라는 조건입니다.
'코딩 테스트 > 30 Days of Pandas' 카테고리의 다른 글
| [6일차] python&sql (0) | 2023.08.22 |
|---|---|
| [5일차] python&sql (0) | 2023.08.21 |
| [4일차] python&sql (0) | 2023.08.20 |
| [3일차] python&sql (0) | 2023.08.19 |
| [2일차] python&sql (0) | 2023.08.18 |