[SECTION 15. 파이썬 기초 문법 - Pandas 실전 활용: 필터링 및 결측치 처리]
True인 데이터만 남긴다고 해서 불리언 인덱싱이라 부릅니다.| 연산자 | 의미 | 예시 |
|---|---|---|
== | 같다 | df['class'] == 'Business' |
!= | 다르다 | df['airline'] != 'Korean Air' |
> , < | 크다, 작다 | df['price'] > 500000 |
& | AND (그리고) | (조건1) & (조건2) |
| ` | ` | OR (또는) |
import pandas as pd
# 1. 데이터 불러오기
df = pd.read_csv('Clean_Dataset.csv')
pd.set_option('display.max_columns', None)
# 2. 'Business' 좌석 등급만 골라내기
# df[조건식] 형태로 작성합니다.
business_df = df[df['class'] == 'Business']
print("--- 비즈니스석 데이터 상위 5행 ---")
print(business_df.head())
print(f"전체 건수: {len(business_df)}건")
()를 쳐야 에러가 나지 않습니다.import pandas as pd
df = pd.read_csv('Clean_Dataset.csv')
# [실습] 항공사가 'Asiana'이면서 가격이 6,000원 이하인 항공권 찾기
condition = (df['airline'] == 'AirAsia') & (df['price'] <= 6000)
target_df = df[condition]
print("--- 아시아나 & 20만원 이하 데이터 ---")
print(target_df.head())

import pandas as pd
import numpy as np
# 1. 실습용 '구멍 난' 데이터 생성
data = {
'이름': ['자바', '바미', '초코', np.nan],
'나이': [3, np.nan, 5, 1],
'몸무게': [4.5, 3.2, np.nan, np.nan],
'소속': [np.nan, np.nan, np.nan, np.nan] # 모든 값이 결측치인 컬럼
}
df = pd.DataFrame(data)
print("--- 원본 데이터 (NaN 확인) ---")
print(df)
dropna(): "불량품은 버린다” → 결측치가 있는 행이나 열을 삭제하는 도구입니다.how 옵션: 얼마나 엄격하게 지울까?how='any' (기본값): 행에 결측치가 하나라도 있으면 삭제how='all': 행의 모든 값이 결측치여야 삭제# 하나라도 NaN이 있으면 삭제 (대부분의 데이터가 사라짐)
df_any = df.dropna(how='any')
# 모든 값이 NaN인 행만 삭제 (여기서는 삭제되는 행이 없음)
df_all = df.dropna(how='all')
fillna(): "빈칸을 메운다” → 삭제 대신 적절한 값으로 채워 넣는 도구입니다.import pandas as pd
import numpy as np
data = {
'이름': ['자바', '바미', '초코', np.nan],
'나이': [3, np.nan, 5, np.nan],
'몸무게': [4.5, 3.2, np.nan, np.nan],
'소속': ["한코딩", np.nan, np.nan, np.nan] # 모든 값이 결측치인 컬럼
}
df = pd.DataFrame(data)
df_custom = df.fillna({'이름' : '이름 없음', '나이' : 0, '몸무게' : 0, "소속" : "무소속"})
print(df_custom)
import pandas as pd
df = pd.read_csv('Clean_Dataset.csv')
# 각 컬럼별로 비어있는 데이터가 몇 개인지 합계 출력
print("--- 컬럼별 결측치 개수 ---")
print(df.isnull().sum())
import pandas as pd
import numpy as np
data = {
'이름': ['자바', '바미', '초코', np.nan],
'나이': [3, np.nan, 5, np.nan],
'몸무게': [4.5, 3.2, np.nan, np.nan],
'소속': ['SBS', np.nan, np.nan, np.nan] # 모든 값이 결측치인 컬럼
}
df = pd.DataFrame(data)
print(df.isnull().sum())
dropna)할지, 특정 값으로 채울지(fillna) 결정합니다.import pandas as pd
df = pd.read_csv('Clean_Dataset.csv')
# 방법 1: 결측치가 하나라도 있는 행을 통째로 삭제 (axis=0)
df_drop = df.dropna(axis=0)
# 방법 2: 결측치를 특정 값(예: 0)으로 채우기
df_fill_zero = df.fillna(0)
# 방법 3: 결측치를 해당 컬럼의 평균값으로 채우기 (가장 많이 권장됨)
price_mean = df['price'].mean()
df['price'] = df['price'].fillna(price_mean)
print("--- 결측치 처리 완료 ---")
import pandas as pd
data = {
'이름': ['자바', '바미', '초코', np.nan],
'나이': [3, np.nan, 5, np.nan],
'몸무게': [4.5, 3.2, np.nan, np.nan],
'소속': ['SBS', np.nan, np.nan, np.nan] # 모든 값이 결측치인 컬럼
}
df = pd.DataFrame(data)
# 방법 1: 결측치가 하나라도 있는 행을 통째로 삭제 (axis=0)
df_drop = df.dropna(axis=0)
# 방법 2: 결측치를 특정 값(예: 0)으로 채우기
df_fill_zero = df.fillna(0)
print("--- 결측치 처리 완료 ---")
Q1. Clean_Dataset.csv를 사용하여 다음 조건에 맞는 데이터를 추출하고 처리하세요.
source_city)가 'Delhi' 이고, 도착 도시(destination_city)가 'Mumbai' 인 데이터만 추출하세요.price)이 높은 순서대로 상위 10개를 출력하세요.import pandas as pd
df = pd.read_csv("clean_dataset.csv")
# 다중 조건 필터링
filtered_df = df[(df['source_city'] == 'Delhi') & (df['destination_city'] == 'Mumbai')]
result_df = filtered_df.sort_values(by='price', ascending=False)
print(result_df.head(10)[['source_city','destination_city','price']])
[SECTION 16. 파이썬 기초 문법 - 데이터 시각화]
Matplotlib과 세련된 디자인의 Seaborn을 사용합니다. 한국어 데이터를 다룰 때는 한글 폰트 설정이 필수입니다.import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 1. 데이터 불러오기
df = pd.read_csv('Clean_Dataset.csv', index_col=0)
# 2. 한글 깨짐 방지 설정 (Windows 기준)
plt.rc('font', family='Malgun Gothic')
plt.rcParams['axes.unicode_minus'] = False # 마이너스 기호 깨짐 방지
print("시각화 준비 완료!")
| 분류 | 메소드 (함수) | 역할 및 목적 | 주요 파라미터 (옵션) |
|---|---|---|---|
| 기본 설정 | plt.rc() / plt.rcParams | 한글 폰트, 마이너스 기호 깨짐 등을 설정 | family(글꼴), size(글자 크기) |
plt.figure() | 그래프를 그릴 도화지(Canvas)를 준비 | figsize=(가로, 세로) # 단위는 inch | |
| 비교 (범주) | sns.barplot() | 막대 그래프. 그룹별 평균값 비교 시 사용 | x, y, data, palette(색상) |
sns.countplot() | 항목별 데이터 개수를 자동으로 세어줌 | x, data, hue(추가 분류) | |
| 분포 (수치) | sns.histplot() | 히스토그램. 데이터가 어디에 몰려 있는지 확인 | bins(막대 개수), kde(곡선 여부) |
sns.boxplot() ⭐ | 상자 그림. 사분위수와 이상치 확인 (시험 빈출) | x, y, data | |
| 관계 | sns.scatterplot() | 산점도. 두 숫자 데이터 간의 상관관계 확인 | x, y, data |
sns.heatmap() ⭐ | 히트맵. 상관계수를 색상으로 시각화 | data, annot=True(숫자 표시) | |
| 꾸미기 | plt.title() | 그래프 상단에 제목을 달아줌 | fontsize(글자 크기) |
plt.xlabel() / ylabel() | X축과 Y축에 이름(라벨)을 붙여줌 | label | |
plt.xticks(rotation=45) | X축 글자가 겹칠 때 각도를 회전시킴 | rotation | |
| 마무리 | plt.show() | 완성된 그래프를 화면에 출력 (마침표 역할) | - |
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 1. 데이터 불러오기
df = pd.read_csv('Clean_Dataset.csv')
plt.rc('font', family='Malgun Gothic')
# 2. 도화지 꺼내기
plt.figure(figsize=(12, 6))
# 3. 그림 그리기
# hue='airline'을 넣어 색상 기준을 명시하고, legend=False로 중복 범례를 숨깁니다.
sns.barplot(x='airline', y='price', data=df, hue='airline', palette='viridis', legend=False)
# 4. 이름표 붙이기
plt.title('항공사별 평균 항공권 가격 현황', fontsize=15)
plt.xlabel('항공사 이름')
plt.ylabel('평균 가격(INR)')
# 5. X축 글자 회전
plt.xticks(rotation=45)
# 6. 출력하기
plt.show()
| 메소드 | 기능 | 주요 매개변수 (Usage) |
|---|---|---|
plt.plot() | 선 그래프 그리기 | x, y: 데이터, label: 범례에 표시할 이름, color: 색상 |
plt.title() | 그래프 제목 설정 | label: 제목 텍스트, fontsize: 글자 크기 |
plt.xlabel() | X축 라벨 설정 | xlabel: 축 이름 |
plt.ylabel() | Y축 라벨 설정 | ylabel: 축 이름 |
plt.legend() | 범례 표시 | loc: 위치(best, upper right 등) |
plt.show() | 그래프 출력 | 없음 (마지막에 호출) |
import pandas as pd
import matplotlib.pyplot as plt
# 1. 데이터 불러오기
df = pd.read_csv('Clean_Dataset.csv', index_col=0)
# 2. 데이터 가공 (항공사별/남은일수별 평균 가격)
vistara = df[df['airline'] == 'Vistara'].groupby('days_left')['price'].mean()
air_india = df[df['airline'] == 'Air_India'].groupby('days_left')['price'].mean()
# 3. 그래프 그리기 (여기에 코드를 완성해 보세요!)
plt.figure(figsize=(10, 5))
# 선 그래프 그리기
plt.plot(vistara.index, vistara.values, label='Vistara')
plt.plot(air_india.index, air_india.values, label='Air_India')
plt.title('Price Trend')
plt.xlabel('Days Left')
plt.ylabel('Avg Price')
plt.legend()
# 표시
plt.show()
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 1. 데이터 불러오기
df = pd.read_csv('Clean_Dataset.csv', index_col=0)
plt.rc('font', family='Malgun Gothic')
# 항공사별 평균 가격 시각화
plt.figure(figsize=(10, 6)) # 도화지 크기 설정
# sns.barplot은 자동으로 평균을 계산해서 그려줍니다.
sns.barplot(x='airline', y='price', data=df)
plt.title('항공사별 평균 항공권 가격')
plt.xlabel('항공사')
plt.ylabel('평균 가격')
plt.show()
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 1. 데이터 불러오기
df = pd.read_csv('student.csv', index_col=0)
plt.rc('font', family='Malgun Gothic')
plt.figure(figsize=(10, 6)) # 도화지 크기 설정
sns.barplot(x='name', y='age', data=df)
plt.title('이름별 평균 나이')
plt.xlabel('이름')
plt.ylabel('나이')
plt.show()
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 1. 데이터 불러오기
df = pd.read_csv('Clean_Dataset.csv', index_col=0)
plt.rc('font', family='Malgun Gothic')
# 전체 항공권 가격 분포 확인
plt.figure(figsize=(10, 6))
# bins는 막대의 개수, kde는 부드러운 곡선 표시 여부입니다.
sns.histplot(df['price'], bins=50, kde=True, color='skyblue')
plt.title('항공권 가격 분포도')
plt.show()
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 데이터 불러오기
df = pd.read_csv('Clean_Dataset.csv', index_col=0)
plt.rc('font', family='Malgun Gothic')
# 좌석 등급(class)별 가격 분포와 이상치 확인
plt.figure(figsize=(8, 6))
sns.boxplot(x='class', y='price', data=df)
plt.title('좌석 등급별 가격 분포 (Economy vs Business)')
plt.show()
| 특징 | 의미 |
|---|---|
| 상자의 높낮이 | 평균적인 가격대 (비즈니스가 훨씬 높음) |
| 상자의 세로 길이 | 가격의 일관성 |
| 상자 밖의 점들 | 예외적인 가격 (평균치를 벗어난 가격들) |
Q1. Clean_Dataset.csv를 활용하여 '출발 도시(source_city)별 비행 시간(duration)의 평균'을 막대 그래프로 그려보세요.
차트 종류: sns.barplot
제목: '출발 도시별 평균 비행 시간'
색상 테마: palette='Set2' 옵션을 추가해 보세요.
정답
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
df = pd.read_csv('Clean_Dataset.csv', index_col=0)
plt.figure(figsize=(10, 5))
sns.barplot(x='source_city', y='duration', data=df, hue='source_city', palette='Set1')
plt.show()