국비과정에서 배운 Pandas의 외부 데이터 로딩과 초기 탐색(EDA) 방법을 정리했다. read_csv()를 중심으로, 데이터 확인 메소드와 열/범위 선택 방법까지 다룬다.
Pandas는 거의 모든 형태의 데이터를 읽을 수 있다. 상황에 맞는 메소드를 고르면 된다.
| 함수 | 대상 파일 형식 | 설명 및 용도 |
|---|---|---|
read_csv() | .csv, .txt | 가장 많이 쓰이는 방식. 콤마(,)나 탭으로 구분된 텍스트 데이터 로드 |
read_excel() | .xls, .xlsx | 엑셀 파일을 불러올 때 사용 |
read_json() | .json | 웹 서버와 데이터를 주고받을 때 쓰는 JSON을 표로 변환 |
read_html() | 웹 페이지 (URL) | 웹 페이지 내의 <table> 태그를 찾아 자동으로 표를 추출 |
가장 자주 쓰이고, 시험에서도 핵심적으로 다뤄지는 메소드다.
주요 파라미터(옵션)
filepath: 파일 경로 혹은 URLencoding: 한글이 깨지면 'cp949' 또는 'utf-8'을 지정sep: 구분자 (기본값은 쉼표 ,)index_col: 특정 열을 인덱스로 사용하고 싶을 때 지정데이터 분석 초기 단계인 EDA(Exploratory Data Analysis, 탐색적 데이터 분석)에서 데이터의 외형과 내부 정보를 파악할 때 쓰는 명령어들이다.
| 분류 | 명령어 | 기능 설명 | 주요 확인 사항 |
|---|---|---|---|
| 데이터 확인 | df.head(n) | 상위 n개 행 반환 | 데이터의 구성 형식 및 실제 값 형태 |
| 데이터 확인 | df.tail(n) | 하위 n개 행 반환 | 데이터 로드 완료 여부 및 마지막 부분 형식 |
| 데이터 구조 | df.shape | 행(Row)과 열(Column) 수 반환 | 전체 데이터의 규모(차원) 파악 |
| 데이터 구조 | df.columns | 모든 열 이름 반환 | 분석에 사용할 특성(Feature) 명칭 확인 |
| 데이터 정보 | df.info() | 인덱스, 컬럼명, 데이터 타입, 결측치 정보 출력 | 결측치(Null) 존재 여부 및 타입 일치 확인 |
| 기술 통계 | df.describe() | 수치형 데이터의 주요 통계량 요약 출력 | 평균, 표준편차, 사분위수, 최댓값/최솟값 확인 |
import pandas as pd
# 1. CSV 데이터 불러오기
df = pd.read_csv('./Clean_Dataset.csv')
df
import pandas as pd
# 1. CSV 파일 불러오기
# index_col=0 은 파일의 첫 번째 열을 인덱스로 지정하겠다는 의미
df = pd.read_csv('./Clean_Dataset.csv', index_col=0)
# 2. 데이터 확인 (상위 5개 행)
print("--- 상위 5개 데이터 (head) ---")
print(df.head())
# 3. 데이터 확인 (하위 3개 행)
print("\n--- 하위 3개 데이터 (tail) ---")
print(df.tail(3))
# 4. 데이터 구조 확인 (행, 열)
print("\n--- 데이터 구조 (shape) ---")
print(df.shape)
# 5. 열 이름 확인
print("\n--- 열 목록 (columns) ---")
print(df.columns)
# 6. 데이터 정보 확인 (타입 및 결측치)
print("\n--- 데이터 정보 (info) ---")
df.info()
# 7. 기술 통계량 확인
print("\n--- 기술 통계 (describe) ---")
print(df.describe())
새로운 데이터를 받으면 보통 head() → shape → columns → info() → describe() 순서로 훑어보면서 데이터의 전체 그림을 파악한다.
특정 항목(Feature)만 뽑고 싶을 땐 대괄호([]) 안에 컬럼명을 넣는다.
import pandas as pd
df = pd.read_csv('./Clean_Dataset.csv')
# 2. 단일 열 선택 (Series 형태로 반환)
airlines = df['airline']
print("--- 단일 열 선택 (airline) ---")
print(airlines.head())
# 3. 여러 열 선택 (DataFrame 형태로 반환)
subset = df[['airline', 'source_city', 'price']]
print("\n--- 여러 열 선택 (airline, source_city, price) ---")
print(subset.head())
⚠️ 여러 열을 선택할 때는 대괄호를 두 번(
[[ ]]) 써야 한다. 안쪽['airline', 'price']는 선택할 열들의 "리스트"이고, 바깥[]는 그 리스트로 DataFrame에서 선택하는 문법이다.
원하는 영역을 행렬 형태로 잘라낼 때는 loc(레이블 기반)와 iloc(정수 인덱스 기반)의 차이를 아는 게 핵심이다.
import pandas as pd
df = pd.read_csv('./Clean_Dataset.csv')
# 0번부터 5번 인덱스 행까지, 'airline'부터 'source_city' 컬럼까지 선택
# loc는 마지막 범위(5번 행, source_city 열)를 포함한다
print("--- loc를 이용한 범위 선택 ---")
print(df.loc[0:5, 'airline':'source_city'])
# 0~4번 행(5번 제외), 0~2번 열(3번 제외) 선택
# iloc는 파이썬 슬라이싱 규칙대로 마지막 인덱스를 포함하지 않는다
print("\n--- iloc를 이용한 범위 선택 ---")
print(df.iloc[0:5, 0:3])
항공권 데이터의 전체 규모를 파악하고, 필요한 열만 골라내기.
Clean_Dataset.csv를 불러와서 전체 행/열 개수 출력df_price에 저장df_price의 상위 10개 데이터 출력import pandas as pd
df = pd.read_csv('Clean_Dataset.csv')
print(f"행과 열의 개수: {df.shape}")
df_price = df[['airline', 'price']]
print(df_price.head(10))
특정 구간의 노선 정보(출발지~도착지)를 집중적으로 확인하기.
loc로 인덱스 50번부터 60번까지 추출info()로 몇 개의 데이터가 선택되었는지 확인import pandas as pd
df = pd.read_csv('Clean_Dataset.csv')
# 50번부터 60번까지의 정보
print(df.loc[50:60, 'source_city':'destination_city'].info())
# 50번부터 60번까지의 데이터 개수
print(df.loc[50:60, 'source_city':'destination_city'].shape[0])
head() → shape → columns → info() → describe() 순서로 먼저 훑어보는 습관이 EDA의 기본이다.df['컬럼'](Series), 여러 열은 df[['컬럼1', '컬럼2']](DataFrame)로 반환 타입이 다르다는 점을 기억하자.loc는 끝 범위를 포함하고 iloc는 끝 범위를 제외한다는 규칙은 앞선 Pandas 기초 편에 이어 계속 나오는 핵심 포인트다.국비과정에서 배운 Pandas 데이터 가공을 정리했다. 열 추가/삽입, 이름 변경, 정렬, 행·열 삭제까지 원본 데이터를 분석 목적에 맞게 다듬는 방법들이다.
| 기능 | 메소드/문법 | 설명 |
|---|---|---|
| 열 추가(계산) | df['새컬럼'] = 연산 | 기존 컬럼을 이용해 새 데이터를 계산해서 추가 |
| 열 삽입 | df.insert(위치, 이름, 값) | 원하는 특정 위치(순서)에 컬럼을 끼워 넣기 |
| 삭제 | df.drop() | 행(Row)이나 열(Column) 삭제. axis 설정이 핵심 |
| 이름 변경 | df.rename() | 컬럼 이름을 더 이해하기 쉬운 명칭으로 변경 |
| 정렬 | df.sort_values() | 특정 기준으로 오름차순/내림차순 정렬 |
df['새이름'] = 계산식 형태로 기존 컬럼을 계산해서 새 컬럼을 만들 수 있다.
# 항공권 가격(price)이 2배로 올랐다고 가정
import pandas as pd
df = pd.read_csv('./Clean_Dataset.csv')
# 'price2'라는 이름으로 2배 가격 열 추가
df['price2'] = df['price'] * 2
print(df[['price', 'price2']].head())
df.insert(위치번호, '열이름', 값)으로 원하는 순서에 컬럼을 끼워 넣을 수 있다. 위치 번호는 0부터 시작한다.
import pandas as pd
df = pd.read_csv('./Clean_Dataset.csv')
# 맨 앞(0번 인덱스)에 '국가' 정보를 넣고 싶을 때
df.insert(0, 'country', 'India')
print(df.head(3))
df.rename(columns={'옛이름': '새이름'})처럼 딕셔너리 구조로 이름을 바꾼다.
import pandas as pd
df = pd.read_csv("Clean_Dataset.csv")
df2 = df.rename(columns={"airline": "항공사"})
print("=== 원본 ===")
print(df.columns)
print("=== 수정본 ===")
print(df2.columns)
💡
rename()은 기본적으로 원본을 바꾸지 않고 새 DataFrame을 반환한다. 원본 자체를 바꾸려면inplace=True옵션을 쓰거나, 위 예제처럼df2 = df.rename(...)으로 다시 할당해야 한다.
by: 기준이 될 컬럼명ascending: True(오름차순, 기본값) / False(내림차순, 큰 것부터)import pandas as pd
df = pd.read_csv("Clean_Dataset.csv")
df_sorted = df.sort_values(by="price", ascending=False)
print(df_sorted[['airline', 'price']])
axis=1: 세로 줄(열, Column) 삭제axis=0: 가로 줄(행, Row) 삭제 (기본값)import pandas as pd
df = pd.read_csv("Clean_Dataset.csv")
df['price2'] = df['price'] * 2
# 열 삭제 (axis=1)
df = df.drop(['price2'], axis=1)
print(df.columns)
import pandas as pd
df = pd.read_csv("Clean_Dataset.csv")
print(df.head())
# 3번째 행을 제거 (axis 기본값 0)
df = df.drop(3)
print(df.head())
⚠️
axis=1은 열,axis=0은 행이라는 게 계속 헷갈리는 부분이다. "axis=1이면 옆으로(가로) 지운다"고 외우면 좀 더 기억하기 쉽다.
항공사 세금 정책 변경으로 모든 항공권 가격을 5% 인상하고, 컬럼 이름도 더 명확하게 바꾸기.
price 컬럼에 1.05를 곱해서 final_price라는 새 열 만들기airline 컬럼 이름을 brand로 변경하기import pandas as pd
df = pd.read_csv('Clean_Dataset.csv')
df['final_price'] = df['price'] * 1.05
df = df.rename(columns={'airline': 'brand'})
df.head()
불필요한 번호 컬럼을 지우고, 비행 시간이 긴 순서대로 데이터를 정리하기.
Unnamed: 0 삭제하기 (axis 설정 주의)is_filtered 컬럼을 만들고 모든 값을 True로 채우기 (df.insert 활용)duration)이 긴 순서(내림차순)로 정렬해서 출력하기import pandas as pd
df = pd.read_csv('Clean_Dataset.csv')
# 1. 불필요한 인덱스 컬럼 삭제 (열 삭제 → axis=1)
df = df.drop(['Unnamed: 0'], axis=1)
# 2. 맨 앞(0번 위치)에 is_filtered 컬럼 추가, 값은 모두 True
df.insert(0, 'is_filtered', True)
# 3. 비행 시간(duration) 내림차순 정렬
df_sorted = df.sort_values(by='duration', ascending=False)
print(df_sorted.head())
df['새컬럼'] = 계산식, 원하는 위치에 넣고 싶으면 df.insert(위치, 이름, 값)으로 구분해서 기억하자.drop(), sort_values() 모두 기본적으로 원본을 바꾸지 않고 새 결과를 반환하므로, 결과를 유지하려면 변수에 다시 할당(df = df.drop(...))하거나 inplace=True를 써야 한다.axis=0(행) / axis=1(열) 구분은 이후 통계 연산(sum, mean 등)에서도 계속 나오는 개념이라 확실히 익혀두면 좋다.