- Percentage of Users Attended a Contest
round(((count(r.user_id)/(select count(*) from users))*100),2)
as percentage
where r.contest_id is not null
- Queries Quality and Percentage
select query_name , round(avg(rating/position),2) as quality , round(((sum(case when rating <3 then 1 else 0 end))/count(1)*100),2) as poor_query_percentage from Queries where query_name is not null group by 1
- Monthly Transactions I
select date_format(trans_date,'%Y-%m') as Month
, country
, count(*) as trans_count
,sum(case when state='approved'then 1
else 0 end) as approved_count
,sum(amount) as trans_total_amount
,sum(case when state='approved'then amount
else 0 end) as approved_total_amount
from Transactions
group by 1,2
이게 best code라고 한다.
📌몰랐던 사실
:sum((state='approved') * amount) 처럼 작성할 수도 있구나...? 이부분 관련해서는 나중에 더 찾아봐야겠다.
어제 배웠던 코드들을 실습으로 진행했다.
# Interaction type 의 결측치: 423개
df3.isnull().sum()
# 결측치 count ❌
df3.groupby('Interaction type')['product id'].count().reset_index()
#각각 1145,855,871이 나온다
#수치로 계속 올바르게 작성한게 맞는지 확인해보는게 매우 중요하다 !! ⭐
3294 - (1145+855+871)
#423
# 인덱스 번호를 매겨서 특정 행의 결측치만 확인해볼 수도 있다.
df.isnull().sum()[13]
# str.split 을 통해 문자열을 분리하고,
#그 값 중 첫번째 인덱스를 가져옴
# df['sw'] = dd['Shipping Weight'].str.split().str[1]과 비교!
df['sw'] = df['Shipping Weight'].str.split().str[0]
🔻
# 이렇게 특정 변수에 담아주지 않으면 전체 필터링이 되고
#가독성이 떨어질 수 있어서 da, db만들어서 담아주는 듯
da = df[df['Is Amazon Seller']=='Y']
db = df[df['Is Amazon Seller']=='N']
#마찬가지로 여기에서도 검증을 거쳤다.
# Is Amazon Seller 컬럼에 따른 sw 결측값 확인하기(검증과정)
df.isnull().sum()[28], da.isnull().sum()[28], db.isnull().sum()[28]
일단 과제 먼저 마무리 해야할 것 같아서 복습은 오늘 여기까지만 했다.
그치만 맨 아래 작성한 학습회고에 이후 복습 내용이 겹치는 게 몇개 있긴하다 !!
필수 1. 데이터 불러오기
Python 라이브러리를 활용하여, 구글 드라이브의 CSV 파일을 DataFrame으로 읽어오는 코드를 작성해주세요.
테이블의 행과 열 개수를 확인해주세요.
테이블의 처음 5줄을 확인해주세요.
import pandas as pd
from google.colab import drive
drive.mount('/content/drive')
#Python 라이브러리를 활용하여, 구글 드라이브의 CSV 파일을 DataFrame으로 읽어오는 코드를 작성해주세요.
df = pd.read_csv("/content/drive/MyDrive/Python 라이브세션/flight_data_homework.csv")
#테이블의 행과 열 개수를 확인해주세요.
df.shape
#테이블의 처음 5줄을 확인해주세요.
df.head()
필수 2. 결측치 처리
import pandas as pd
df = pd.read_csv("/content/drive/MyDrive/Python 라이브세션/flight_data_homework.csv")
#각 컬럼별 결측치 개수를 구해주세요.
df.isna().sum()
#결측치가 있는 행을 모두 제거해주세요.
df.dropna()
필수 3. 조건에 맞는 데이터 추출하기
import pandas as pd
df = pd.read_csv("/content/drive/MyDrive/Python 라이브세션/flight_data_homework.csv")
#데이터프레임의 Destination 컬럼 기준 price의 평균값과 중앙값을 동시에 구해주세요.
#단, 값은 모두 소수점 첫번째 자리까지 표현해주세요.
df.groupby('Destination')['Price'].agg(['mean','median']).round(1)
#데이터프레임의 Airline, Total_Stops 기준 Route 컬럼을 중복값 없이 추출해주시고, 인덱스를 재정렬해주세요.
#이를 df2 라는 dataframe 으로 받아주세요.
df2 = df.groupby(['Airline','Total_Stops'])['Route'].unique().reset_index(drop=True)
#df2
필수 4. 조건에 맞는 데이터 추출하기2
import pandas as pd
df = pd.read_csv("/content/drive/MyDrive/Python 라이브세션/flight_data_homework.csv")
#피벗테이블을 구현하여 출발지와 도착지를 기준으로 한 Airline을 카운트해주세요. 그리고, 카운트 값을 기준으로 내림차순 정렬해주세요.
pd.pivot_table(df,index=['Source','Destination'], values='Airline', aggfunc='nunique').sort_values(by='Airline', ascending=False)
#Airline 컬럼이 Air India 이고, Price 컬럼이 7000 이상인 데이터를 필터링 해주세요.
mask = (df['Airline']=='Air India') & ((df['Price']>=7000))
df[mask]
첫번째 문제를 원래
aggfunc='count'
로 풀었었다. 저번 조 팀원분들이 감사하게도 팀스터디를 제안해주셔서 같이 답을 맞춰봤는데, Airline (nunique값 12개)의 개수니까 4xxx개가 나오는게.. 이상하다라고 인사이트를 공유해주셨다.
나도 미처 이 생각은 못했던 것 같아, 중복제거로 수정해서 제출해보려한다..!
.
.
도전 1. 조건에 맞는 데이터 추출하기3
import pandas as pd
df_date = pd.read_csv("/content/drive/MyDrive/Python 라이브세션/flight_data_homework.csv", parse_dates=['Date_of_Journey'], dayfirst=True, infer_datetime_format=True)
#df_date.head()
min_Date_of_Journey = df_date['Date_of_Journey'].min()
from datetime import datetime
from dateutil.rrule import rrule, WEEKLY, WE
start_date = min_Date_of_Journey
weekly_rule = rrule( DAILY, dtstart=start_date,byweekday=WE )
df_wed = df_date[df_date['Date_of_Journey'].isin(weekly_rule)]
#df_wed.head()
answer = df_wed['Price'].mean().round()
print(answer)
9278.0
반올림 하지 않으면,
9277.51418951419
도전 2. 조건에 맞는 데이터 추출하기4
import pandas as pd
#import numpy as np
df = pd.read_csv("/content/drive/MyDrive/Python 라이브세션/flight_data_homework.csv")
time = pd.to_datetime(df['Dep_Time'], infer_datetime_format=True)
df['time2']= time.dt.hour
#df['time2']
df['Dep_Time_Zone']= df['time2'].apply(lambda x: '밤' if 0 <= x < 5 else ('아침' if 5 <= x < 12 else ('낮' if 12 <= x < 18 else '오후')))
df['Dep_Time_Zone'].value_counts()
🔻
count
Dep_Time_Zone
아침 4912
오후 2702
낮 2604
밤 465
dtype: int64
- daa = da[da['sw'].isnull()==True] 이 코드에서
==True
이게 없으면?
코드 가독성을 높이기 위해 사용되기도 하지만,
da['sw'].isnull() 자체가 이미 불리언(Boolean) 시리즈를 생성
=> == True
는 불리언 시리즈의 각 값이 True인지 다시 확인
하는 단계
결론
: da['sw'].isnull()이 이미 불리언이므로, ==True 없이도 da[da['sw'].isnull()]로 충분히 동작함.
- df1 데이터프레임에서 '이상치여부' 열에 있는 '이상치' 값만 카운트하려면
count_outliers = df1['이상치여부'].value_counts()['이상치']
3.df이름['칼럼이름'].unique()와 drop_duplicates 는 같은 기능인가?
df['칼럼이름'].unique()
기능
: 지정한 열(칼럼이름)의 고유 값들을 넘파이 배열(Numpy array) 형태로 반환
대상
: 단일 열(Series)에만 적용 가능.
결과
: 중복 없는 값들만 담긴 배열. 예: array([1, 2, 3]).
df['칼럼이름'].drop_duplicates()
기능
: 지정한 열에서 중복을 제거한 판다스 시리즈(Pandas Series)를 반환
대상
: 단일 열(Series)에 적용하며, 데이터프레임 전체에도 사용 가능(df.drop_duplicates()).
결과
: 중복 없는 값들을 시리즈로 반환. 예: 0 A, 1 B, 2 C (인덱스 포함).
결과적으로 중복 없는 값을 추출한다는 점은 비슷하지만, 반환 형식과 사용 맥락이 다르다.
.unique()는 간단히 고유 값 배열이 필요할 때, .drop_duplicates()는 시리즈 형태로 작업을 이어가거나 데이터프레임 전체를 다룰 때 유리 !!!
단순히 고유 값 확인은 .unique()로, 데이터 구조를 유지하며 다룰 땐 .drop_duplicates()를 활용하면 되겠다!!
df2 = df.groupby(['Airline','Total_Stops'])['Route'].unique().reset_index(drop=True) 이렇게 작성한 코드는 인덱스가 0부터 27까지,
df2 = df.groupby(['Airline','Total_Stops'])['Route'].nunique() 이렇게 작성한 코드는 209개가 나온다.
✅.unique()
: 고유 값 자체를 나열 → 결과 행 개수는 그룹 수(28개).
🔻🔻
.unique(): 'Route'의 중복 없는 값 리스트를 추출 → 데이터프레임으로 고유 경로를 확인하고 싶을 때 적합.
✅.nunique()
: 고유 값의 개수를 계산 → 결과는 각 그룹별 숫자. 실제로는 .nunique() 결과를 .sum()
하면 전체 고유 'Route' 개수를 알 수 있겠다.
🔻🔻
.nunique(): 'Route'의 중복 없는 값 개수를 추출 → 통계나 개수 분석이 목적일 때 적합.
핵심 차이
: .unique()는 값을, .nunique()는 개수를 다룸.
python에서 평균은 avg가 아니라 mean이다.
도전1 문제 풀면서 반복문 썼다가, 반복문을 잘못썼는지 무한 반복됐다. 강제 종료시켰다..
lambda함수에서 elif를 못쓰는 대신, else이후 괄호를 열고 inline if문을 이어서 작성해나갈 수 있다.
오늘자 라이브 세션을 다 복습하지 못한게 아쉬움이 남지만,
과제를 풀면서 + 같이 팀 스터디를 진행하면서 다시 복기한 내용들이 소중하게 느껴지기도 한다.
내일 해설 세션을 듣고 이상치 후반부터 다시 복습해봐야겠다. 꼭 시각화도 남은 2개 듣고 !!!
얼른 내일 해설이 듣고싶다 !!
그리고 .. 기초 프로젝트 발제 뭔가 떨린다.......ㅎㅎ..
QR 체크인 잊지말자 !!!!🚀💨🍀