Pandas 개인 과제

Suhyeon Lee·2024년 10월 28일
0

필수 1. 데이터 불러오기

(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()

필수 2. 데이터 불러오기

(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()

필수 3. 데이터 불러오기

(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()

필수 4. 조건에 맞는 데이터 추출하기2

(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)

보충 학습

  • Airline 컬럼이 Air India 이고, Price 컬럼이 7000 이상인 데이터를 필터링: df[(df['Airline'] == 'Air India') & (df['Price'] >= 7000)]라고 써도 됨

도전 5. 조건에 맞는 데이터 추출하기3

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')
  • rrule로 풀기
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()

보충 학습

infer_datetime_format

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 매개변수

dayfirst 및 yearfirst 매개 변수는 각각 형식에 일 또는 년도가 먼저 나오는 경우 True로 설정 → Pandas가 날짜를 구문 분석하는 데 도움(이정표가 됨)

시간 정보가 있는 열을 datetime 자료형으로 변환

df['컬럼명'] = pd.to_datetime(df['컬럼명'])

요일 정보 추출

dt.weekday

  • datetime 자료형에서 dt.weekday 속성을 통하여 요일 정보를 숫자로 가져올 수 있음
    • 0은 월요일, 1은 화요일, ..., 6은 일요일을 의미
      dt.day_name()
  • datetime 자료형에서 제공하는 day_name() 메서드로 각 요일의 영어 이름을 단번에 가져오는 것이 가능
    • 참고 : 속성이 아니라 메서드라 dt.day_name이 아닌 dt.day_name()으로 사용해야 함!
    • In general, to access datetime methods, use the .dt accessor on a pandas column

요일의 한글 이름을 추출

  • apply 메소드 등의 기능을 활용하여 weekday의 정보를 월 ~ 일의 이름으로 변환
# 0~6번 인덱스 위치에 각 한글 요일 이름이 담긴 리스트
weekday_list = ['월', '화', '수', '목', '금', '토', '일']

# apply 함수로 숫자 -> 요일 이름으로 변환
df['요일'] = df.apply(lambda x : weekday_list[x['weekday']], axis = 1)

df

도전 6. 조건에 맞는 데이터 추출하기4

출발 시간(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은 필수가 아님

"프로퍼티"

라이브러리를 만들어도 됨

profile
2 B R 0 2 B

0개의 댓글