10. 데이터프레임이란 무엇인가

🎯 이 장의 목표
  • 데이터프레임(DataFrame)이 무엇인지 안다
  • 딕셔너리·CSV·HTML 등 다양한 방법으로 데이터프레임을 만든다
  • CSV로 저장하고, 인덱스를 설정·재설정한다
💡 팁
맨 위 셀에서 import pandas as pd를 먼저 실행하세요.

먼저: 데이터프레임이 뭔가요?

데이터프레임(DataFrame)행과 열을 가진 2차원 표입니다. 가장 쉬운 비유는 엑셀 시트 한 장입니다. 우리가 데이터 분석에서 다루는 데이터 대부분이 이 형태입니다.

앞 장의 시리즈가 한 개의 열이었다면, 데이터프레임은 여러 시리즈(열)를 나란히 붙인 것입니다.

flowchart TB
    subgraph DF["데이터프레임 (DataFrame)"]
        direction TB
        H["index │ 이름 │ 나이 │ 도시"]
        R0["0 │ 철수 │ 20 │ 서울"]
        R1["1 │ 영희 │ 22 │ 부산"]
        R2["2 │ 민수 │ 25 │ 인천"]
    end
    classDef header fill:#d0ebff,stroke:#1971c2,color:#000
    classDef row fill:#f8f9fa,stroke:#adb5bd,color:#000
    class H header
    class R0,R1,R2 row
  • 행(row): 가로 한 줄 (보통 "한 건의 기록", 예: 한 사람)
  • 열(column): 세로 한 줄 (보통 "한 가지 속성", 예: 나이)
  • 인덱스(index): 각 행의 이름표 (시리즈와 같은 개념)
🔑 새 용어 — 행과 열
  • 행(row): 가로 방향. 데이터 한 건. 예: "철수, 20, 서울"이 한 행.
  • 열(column, 컬럼): 세로 방향. 같은 종류의 값 모음. 예: "나이" 열은 모든 사람의 나이.

데이터프레임 만들기 (1) — 딕셔너리로

가장 흔한 방법입니다. 0부에서 배운 딕셔너리를 쓰는데, 키가 열 이름, 값이 그 열의 데이터(리스트)가 됩니다.

PYTHON
import pandas as pd

df = pd.DataFrame({
    "이름": ["철수", "영희", "민수"],
    "나이": [20, 22, 25],
    "도시": ["서울", "부산", "인천"]
})
print(df)

실행 결과:

CODE
   이름  나이  도시
0  철수  20  서울
1  영희  22  부산
2  민수  25  인천

딕셔너리의 각 키("이름", "나이", "도시")가 열 이름이 되고, 각 리스트가 그 열의 값이 됐습니다. 왼쪽 0, 1, 2는 자동으로 붙은 인덱스입니다.

💡 팁
패턴 기억하기: {"열이름": [값들], "열이름2": [값들2]} → 표 한 장. 이 패턴은 데이터를 직접 만들 때 계속 씁니다.

미리 보기와 정보 확인

데이터프레임을 받으면 가장 먼저 하는 일들입니다.

PYTHON
print(df.head())      # 앞 5줄 (기본값)
print(df.tail(2))     # 뒤 2줄
print(df.shape)       # (행 수, 열 수)
print(df.columns)     # 열 이름들
print(df.info())      # 전체 요약 (타입·결측 등)
print(df.describe())  # 숫자 열의 통계 요약
명령보여 주는 것
df.head(n)앞 n줄 (기본 5)
df.tail(n)뒤 n줄
df.shape(행 수, 열 수)
df.columns열 이름 목록
df.info()열별 타입·결측치 개수 등
df.describe()숫자 열의 평균·최소/최대 등
💡 팁
새 데이터를 받으면 이 순서로: df.head()로 생김새 보고 → df.shape로 크기 보고 → df.info()로 타입·빈칸 확인 → df.describe()로 분포 파악. 이 4종 세트가 분석의 출발점입니다.

데이터프레임 만들기 (2) — CSV 파일 읽기

실제 분석에선 대부분 파일에서 불러옵니다. Colab 장에서 본 read_csv를 씁니다.

PYTHON
import pandas as pd

url = "https://raw.githubusercontent.com/mwaskom/seaborn-data/master/tips.csv"
df = pd.read_csv(url)
print(df.head())
print(df.shape)

실행 결과:

CODE
   total_bill   tip     sex smoker  day    time  size
0       16.99  1.01  Female     No  Sun  Dinner     2
1       10.34  1.66    Male     No  Sun  Dinner     3
2       21.01  3.50    Male     No  Sun  Dinner     3
3       23.68  3.31    Male     No  Sun  Dinner     2
4       24.59  3.61  Female     No  Sun  Dinner     4
(244, 7)

(244, 7)은 244행 7열, 즉 식당 손님 244팀의 기록이 7개 항목으로 있다는 뜻입니다.

데이터프레임 만들기 (3) — HTML 표 읽기

웹페이지의 표를 통째로 읽어올 수도 있습니다. pd.read_html(url)은 그 페이지의 모든 표를 데이터프레임 리스트로 돌려줍니다.

PYTHON
import pandas as pd

# 웹페이지의 표들을 리스트로 가져옴
tables = pd.read_html("https://en.wikipedia.org/wiki/List_of_countries_by_population_(United_Nations)")
df = tables[0]      # 첫 번째 표 선택
print(df.head())
⚠️ 흔한 실수
흔한 함정 — read_html은 '리스트'를 돌려준다
read_html의 결과는 표 하나가 아니라 표들의 목록입니다. 그래서 tables[0]처럼 몇 번째 표인지 골라야 데이터프레임이 됩니다. 또 페이지 구조가 복잡하면 원하는 표가 몇 번째인지 직접 확인해야 합니다. (lxml 같은 라이브러리가 필요할 수 있는데, Colab엔 보통 이미 설치돼 있습니다.)

CSV로 저장하기

분석한 결과를 파일로 내보낼 때는 to_csv를 씁니다.

PYTHON
df.to_csv("결과.csv", index=False)
🔑 새 용어 — index=False
저장할 때 index=False를 주면 행 번호(인덱스)를 파일에 쓰지 않습니다. 이걸 빼면 0, 1, 2… 번호가 쓸데없는 첫 열로 저장돼 나중에 헷갈리니, 보통 index=False를 권장합니다.

Colab에서 저장한 파일은 왼쪽 폴더 패널(📁)에서 확인하고 내려받을 수 있습니다.

인덱스 설정하고 재설정하기

특정 열을 행의 이름표(인덱스)로 삼으면 그 열로 데이터를 찾기 편해집니다.

PYTHON
import pandas as pd

df = pd.DataFrame({
    "이름": ["철수", "영희", "민수"],
    "나이": [20, 22, 25],
    "도시": ["서울", "부산", "인천"]
})

df2 = df.set_index("이름")    # '이름' 열을 인덱스로
print(df2)

실행 결과:

CODE
    나이  도시
이름
철수  20  서울
영희  22  부산
민수  25  인천

이제 이름으로 행을 찾을 수 있습니다(다음 장의 .loc 활용). 되돌리려면 reset_index():

PYTHON
df3 = df2.reset_index()   # 인덱스를 다시 일반 열로
print(df3)

실행 결과:

CODE
   이름  나이  도시
0  철수  20  서울
1  영희  22  부산
2  민수  25  인천
메서드하는 일
set_index("열")특정 열을 인덱스로 지정
reset_index()인덱스를 일반 열로 되돌리고 0,1,2… 새 인덱스 부여

🛠 미니 챌린지

  1. 친구 3명의 이름, 취미, 나이를 담은 데이터프레임을 딕셔너리로 만드세요.
  2. 그 데이터프레임의 shape와 열 이름(columns)을 출력하세요.
  3. 이름 열을 인덱스로 설정한 새 데이터프레임을 만들어 출력하세요.

✅ 미니 챌린지 해설

PYTHON
import pandas as pd

# 1. 데이터프레임 만들기
df = pd.DataFrame({
    "이름": ["가영", "나영", "다영"],
    "취미": ["등산", "독서", "게임"],
    "나이": [21, 23, 20]
})
print(df)

실행 결과:

CODE
   이름  취미  나이
0  가영  등산  21
1  나영  독서  23
2  다영  게임  20
PYTHON
# 2. 모양과 열 이름
print(df.shape)
print(df.columns)

실행 결과:

CODE
(3, 3)
Index(['이름', '취미', '나이'], dtype='object')
PYTHON
# 3. 인덱스 설정
df_indexed = df.set_index("이름")
print(df_indexed)

실행 결과:

CODE
    취미  나이
이름
가영  등산  21
나영  독서  23
다영  게임  20

이 장에서 배운 것

  • 데이터프레임은 행과 열을 가진 2차원 표로, 엑셀 시트와 같다.
  • 딕셔너리({"열": [값들]})·CSV(read_csv)·HTML(read_html)로 만들 수 있다.
  • 새 데이터는 head·shape·info·describe 4종 세트로 먼저 파악한다.
  • to_csv("파일.csv", index=False)로 저장한다.
  • set_index로 열을 인덱스로 삼고, reset_index로 되돌린다.

✍️ 확인 문제

  1. 데이터프레임에서 "행"과 "열"은 각각 무엇을 뜻하나요?
  2. pd.read_html의 결과를 바로 데이터프레임처럼 쓰면 안 되는 이유는 무엇인가요?
  3. to_csv에서 index=False를 주는 이유는 무엇인가요?
다음 장에서는 데이터프레임에서 원하는 열·행·값을 자유자재로 꺼내는 법(.loc, .iloc)과 열을 추가·삭제하는 법을 배웁니다.
👉 11. 열 선택·추가·삭제와 요소 선택