(1) Python 라이브러리를 활용하여, 구글 드라이브의 CSV 파일을 데이터프레임으로 읽어오는 코드를 작성해주세요.
(2) 테이블의 행과 열 개수를 확인해주세요.
(3) 테이블의 처음 5줄을 확인해주세요.
import pandas as pd
import numpy as np
from datetime import datetime, timedelta
# Python 라이브러리를 활용하여, 구글 드라이브의 CSV 파일을 데이터프레임으로 읽어오는 코드를 작성해주세요.
df = pd.read_csv("flight_data_homework.csv")
# 테이블의 행과 열 개수를 확인해주세요.
df.shape
# 테이블의 처음 5줄을 확인해주세요.
df.head()
(1) 각 컬럼별 결측치 개수를 구해주세요.
(2) 결측치가 있는 행을 모두 제거해주세요.
import pandas as pd
import numpy as np
from datetime import datetime, timedelta
df = pd.read_csv("flight_data_homework.csv")
# 각 컬럼별 결측치 개수를 구해주세요.
df.isna().sum()
# 결측치가 있는 행을 모두 제거해주세요.
df = df.dropna()
# 결측치 제거 확인
df.isna().sum()
(1) 데이터프레임의 Destination 컬럼 기준 price의 평균값과 중앙값을 동시에 구해주세요. 단, 값은 모두 소수점 첫번째 자리까지 표현해주세요.
(2) 데이터프레임의 Airline, Total_Stops 기준 Route 컬럼을 중복값 없이 추출해주시고, 인덱스를 재정렬해주세요. 이를 df2 라는 dataframe 으로 받아주세요.
import pandas as pd
import numpy as np
from datetime import datetime, timedelta
df = pd.read_csv("flight_data_homework.csv")
df = df.dropna()
# 데이터프레임의 Destination 컬럼 기준 price의 평균값과 중앙값을 동시에 구해주세요.
# 단, 값은 모두 소수점 첫 번째 자리까지 표현해주세요.
df.groupby('Destination')['Price'].agg(['median', 'mean']).round(1)
# 데이터프레임의 Airline, Total_Stops 기준 Route 컬럼을 중복값 없이 추출해주시고, 인덱스를 재정렬해주세요.
# 이를 df2 라는 dataframe 으로 받아주세요.
df2 = df.groupby(['Airline', 'Total_Stops'])['Route'].unique().reset_index()
# df2 확인
df2.head()
(1) 피벗테이블을 구현하여 출발지와 도착지를 기준으로 한 Airline을 카운트해주세요. 그리고, 카운트 값을 기준으로 내림차순 정렬해주세요.
(2) Airline 컬럼이 Air India 이고, Price 컬럼이 7000 이상인 데이터를 필터링 해주세요.
import pandas as pd
import numpy as np
from datetime import datetime, timedelta
df = pd.read_csv("flight_data_homework.csv")
df = df.dropna()
# 피벗테이블을 구현하여 출발지와 도착지를 기준으로 한 Airline을 카운트해주세요.
# 그리고, 카운트 값을 기준으로 내림차순 정렬해주세요.
pd.pivot_table(df, values = 'Airline', index = ['Source', 'Destination'], aggfunc='count').sort_values('Airline', ascending=False)
# Airline 컬럼이 Air India 이고, Price 컬럼이 7000 이상인 데이터를 필터링 해주세요.
df.loc[(df['Airline'] == 'Air India') & (df['Price'] >= 7000)]
# 추가: 구현한 피벗테이블에서 Airline 컬럼이 Air India이고, Price 컬럼이 7000 이상인 데이터 필터링
pivot_t = df.loc[(df['Airline'] == 'Air India') & (df['Price'] >= 7000)]
pd.pivot_table(pivot_t, values = 'Airline', index = ['Source', 'Destination'], aggfunc='count').sort_values('Airline', ascending=False)
df[(df['Airline'] == 'Air India') & (df['Price'] >= 7000)]
라고 써도 됨Date_of_Journey 기준 수요일에 예약된 경우의 평균 가격을 구해주세요.
힌트 (1) pandas의 to_datetime 함수의 infer_datetime_format(여러 datetime 유명한 포맷 중에서 datetime이 어떤 형식으로 이루어졌는지 확인 후 자동으로 변환)df = pd.read_csv("flight_data_homework.csv" , parse_dates=['Date_of_Journey'] , dayfirst=True)
df = pd.read_csv("flight_data_homework.csv" , parse_dates=['Date_of_Journey'] , date_format='Mixed' , dayfirst=True)
힌트 (2) 아래 두가지 방식 중 하나를 선택하여 문제를 풀어주세요.
a. dt.day_name() 의 사용
b. rrule 함수의 byweekday property 사용
→ 함수 사용을 위해, dtstart는 Date_of_Journey 컬럼의 최소값으로 설정해주세요.
→ rrule byweekday property는 아래와 같이 사용할 수 있습니다.#문자열 형식을 활용하지 않을 경우, # 라이브러리 import 예시 from dateutil.rrule import rrule, WEEKLY #문자열 형식을 활용할 경우, # 라이브러리 import 예시 # (월요일, 화요일, 일요일 사용) from dateutil.rrule import rrule, WEEKLY, MO, TU, SU 월: MO 또는 0 화: TU 또는 1 수: WE 또는 2 목: TH 또는 3 금: FR 또는 4 토: SA 또는 5 일: SU 또는 6 사용법 rrule(~~, byweekday=❓❓❓)
import pandas as pd
import numpy as np
from datetime import datetime, timedelta
df = pd.read_csv("flight_data_homework.csv")
df = df.dropna()
df['Date_of_Journey'] = pd.to_datetime(df['Date_of_Journey'], dayfirst=True)
df['Day_Name'] = df['Date_of_Journey'].dt.day_name()
wed = df.loc[df['Day_Name'] == 'Wednesday']
pd.pivot_table(wed, values = 'Price', index = 'Day_Name', aggfunc='mean')
import pandas as pd
import numpy as np
from datetime import datetime, timedelta
from dateutil.rrule import rrule, WEEKLY, WE
df = pd.read_csv("flight_data_homework.csv"
, parse_dates=['Date_of_Journey']
, dayfirst=True)
df = df.dropna()
wky = list(rrule(WEEKLY, dtstart=min(df['Date_of_Journey']), until=max(df['Date_of_Journey']), byweekday = WE))
mask = df['Date_of_Journey'].isin(wky)
wednesday = df[mask]
wednesday['Price'].mean()
Python pandas의 read_csv() 함수를 사용하여 csv file, text file 을 읽어와 DataFrame을 만들 때 날짜/시간 (Date/Time) 이 포함되어 있을 경우 이를 날짜/시간 형태(DateTime format)에 맞도록 파싱하여 읽어오는 방법 중 하나
🡆 UserWarning: The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.
dayfirst 및 yearfirst 매개 변수는 각각 형식에 일 또는 년도가 먼저 나오는 경우 True로 설정 → Pandas가 날짜를 구문 분석하는 데 도움(이정표가 됨)
df['컬럼명'] = pd.to_datetime(df['컬럼명'])
dt.weekday
dt.day_name()
# 0~6번 인덱스 위치에 각 한글 요일 이름이 담긴 리스트
weekday_list = ['월', '화', '수', '목', '금', '토', '일']
# apply 함수로 숫자 -> 요일 이름으로 변환
df['요일'] = df.apply(lambda x : weekday_list[x['weekday']], axis = 1)
df
출발 시간(Dep_Time) 컬럼을 기준으로 lambda 함수를 활용하여 아침, 오후, 저녁, 밤 비행기로 항공편(Airline)을 분류하고 그 개수를 count 해주세요.
아침: 5시 이상 12시 미만 낮: 12시 이상 18시 미만 오후: 18시 이상 24시 미만 밤: 24시 이상 5시 미만 (즉, 위의 세가지가 아닌 경우)
힌트 (1) pandas의 to_datetime 함수의 infer_datetime_format(여러 datetime 유명한 포맷 중에서 datetime이 어떤 형식으로 이루어졌는지 확인 후 자동으로 변환)
힌트 (2) inline(one-line) if 절
- 코드 가독성을 위해, 한 줄에 if함수를 사용하는 것을 의미합니다.
- 문법
if절이 참일 경우 결과값 if 조건 if절이 거짓일 경우 결과값
- 주의할 점
- inline if 절에는 elif 를 사용할 수 없습니다.
- 사용 예
# 기존 def plus(i): if i<5: print(0) else: print(1) plus(100) --------------------------------------------- # inline if i = 100 print(0 if i<5 else 1)
import pandas as pd
import numpy as np
from datetime import datetime, timedelta
df = pd.read_csv("flight_data_homework.csv")
df = df.dropna()
df['Dep_Time'] = pd.to_datetime(df['Dep_Time'], format='%H:%M')
df['Hour'] = df['Dep_Time'].dt.hour
df['Time_Zone'] = df['Hour'].transform(lambda x: pd.cut(x, [0, 5, 12, 18, 24], labels= ['밤', '아침', '낮', '오후'], right=False))
pd.pivot_table(df, values = 'Airline', index = 'Time_Zone', aggfunc='count', observed=True)
df[['Airline','Total_Stops','Route']].groupby(['Airline','Total_Stops']).nunique()
이렇게 하면 dataframe으로도 나오더라구요
column은 필수가 아님
"프로퍼티"
라이브러리를 만들어도 됨