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… 새 인덱스 부여 |
🛠 미니 챌린지
- 친구 3명의
이름,취미,나이를 담은 데이터프레임을 딕셔너리로 만드세요. - 그 데이터프레임의
shape와 열 이름(columns)을 출력하세요. 이름열을 인덱스로 설정한 새 데이터프레임을 만들어 출력하세요.
✅ 미니 챌린지 해설
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·describe4종 세트로 먼저 파악한다. to_csv("파일.csv", index=False)로 저장한다.set_index로 열을 인덱스로 삼고,reset_index로 되돌린다.
✍️ 확인 문제
- 데이터프레임에서 "행"과 "열"은 각각 무엇을 뜻하나요?
pd.read_html의 결과를 바로 데이터프레임처럼 쓰면 안 되는 이유는 무엇인가요?to_csv에서index=False를 주는 이유는 무엇인가요?
다음 장에서는 데이터프레임에서 원하는 열·행·값을 자유자재로 꺼내는 법(.loc,.iloc)과 열을 추가·삭제하는 법을 배웁니다.
👉 11. 열 선택·추가·삭제와 요소 선택