선택 참고 실습 · 기존 CSV/DataFrame 과정

아래의 교시·시간·제출 안내는 기존 실습을 재현하기 위한 기록입니다. 현재 9주차의 공통 과제나 제출·귀가 조건으로 적용하지 않습니다. 필요한 개념과 코드를 찾아 활용하세요. 현재 9주차 1교시: AI와 데이터 프로젝트 시작하기 →

공공데이터 / CSV / pandas / DataFrame

참고 실습 2: CSV를 DataFrame으로 읽고 고르기

공공데이터 CSV를 Python의 표로 읽습니다. 표의 크기와 열을 확인한 뒤, 마포구와 도서관을 차례로 고르는 공통 예제를 따라갑니다.

9주차2교시기본 50분개인 실습

실제 데이터로 완성하는 나의 문화공간 목록

오늘의 학습 목표

  • read_csv로 CSV를 파싱하고 DataFrame으로 읽습니다.
  • head, shape, columns로 표의 첫 행·전체 크기·열 이름을 확인합니다.
  • 열 선택 후 마포구, 도서관 조건을 순서대로 적용합니다.

교안과 노트북을 함께 보는 방법

노트북 하나를 세 교시 동안 이어서 사용합니다. 셀 번호는 제목의 번호이며 실행 버튼 옆의 실행 횟수와 다릅니다. 교안의 코드는 해당 셀의 설명입니다. 같은 코드를 새 셀에 덧붙이지 말고 번호가 같은 기존 셀을 실행하세요.

지금 실행할 범위
교시노트북 위치끝났을 때 보일 결과
1교시셀 1준비 완료와 입력 파일명
2교시셀 2~7전체 → 마포구 → 마포구 도서관
3교시셀 8~11나의 후보 → 새 CSV → 다시 읽기 → 검사

각 단원은 실행 절차 뒤에 개념 풀이, 실제 데이터 도해, 예상과 결과를 비교하는 연습이 이어집니다. 먼저 기존 셀의 결과를 확인하고, 설명을 읽으며 그 결과가 나온 이유를 짚어 보세요. 읽기용 예시 코드는 새 셀에 추가하지 않습니다.

0-5분 · 같은 노트북에서 공통 예제 시작하기

1교시에는 원본 CSV를 가져와 셀 1의 준비를 마쳤습니다. 이제 파일 속 기록을 Python의 표로 읽습니다. CSV는 저장 형식이고, DataFrame은 pandas가 메모리에서 다루는 행과 열의 2차원 표입니다.

이번 교시는 모두 마포구 → 도서관을 같은 순서로 고릅니다. 자기 지역은 3교시에서 적용합니다. 셀 1의 준비 완료가 보이는지 확인하고, 런타임을 다시 시작했다면 셀 1부터 실행합니다.

  1. 1교시 · 가져오기공공데이터 CSV출처에서 원본 파일 받기
  2. 2교시 · 공통 예제DataFrame마포구 → 도서관 순서로 선택하기
  3. 3교시 · 개인 적용나만의 CSV내 조건으로 선택하고 저장하기
파일과 표를 구분하기
대상어디에 있는가이번 실습의 이름
원본 CSV파일 패널의 저장 파일셀 1에서 선택한 원본
DataFramePython 실행 중의 표df → places → mapo_places → mapo_libraries
결과 CSV3교시에 새로 저장할 파일week09_학번_이름_places.csv
DataFrame에서 행을 고르면 원본 CSV도 바뀔까?

아닙니다. 메모리에서 다른 표를 만드는 것이므로 원본 파일은 그대로입니다. 파일에 기록하는 to_csv는 3교시에서 배웁니다.

앞 주차의 함수·이미지 객체에서 표 객체로

6주차에서는 함수에 값을 전달하고 return으로 받은 결과에 이름을 붙였습니다. 7주차에서는 파일을 열어 이미지 객체를 얻고, 그 객체를 변형한 뒤 저장했습니다. 이번 주에도 입력 파일을 읽어 작업할 객체를 얻는 순서는 같습니다. 이미지의 픽셀 대신 행과 열을 다룬다는 점이 달라집니다.

파일은 실행을 마쳐도 보관할 수 있는 저장물입니다. DataFrame은 실행 중인 Python이 연산할 수 있도록 만든 표 객체입니다. 파일을 열었다고 곧바로 원본 파일이 편집되는 것이 아니며, 표를 선택한 결과도 저장을 호출하기 전까지 새 CSV가 되지 않습니다. 이 차이는 3교시에서 다시 중요해집니다.

입력 → 작업 객체 → 결과 파일
7주차의 연결

이미지 파일을 열기
이미지 객체의 크기·위치 변형
완성 이미지를 저장하기

9주차의 연결

CSV 파일을 읽기
DataFrame의 행·열 선택
선택한 표를 CSV로 저장하기

라이브러리와 객체는 달라져도 입력을 읽고, 결과를 만들고, 파일로 남기는 구조는 이어집니다.

기억할 점 새 문법을 볼 때 이전에 배운 입력·함수 호출·반환값·변수의 역할부터 찾아봅니다.

표를 고르기 전에 질문을 실행 순서로 바꾸기

공통 질문은 “마포구에 있는 도서관은 어디인가?”입니다. 이를 실행 순서로 풀면 먼저 필요한 항목을 남기고, 자치구가 마포구인지 비교하고, 남은 기록의 주제분류가 도서관인지 비교합니다. 한 번에 최종 결과만 만들지 않고 중간 표를 보관하면 각 조건이 무엇을 줄였는지 알 수 있습니다.

places, mapo_places, mapo_libraries는 라이브러리가 정한 특별한 단어가 아니라 결과의 역할을 설명하려고 붙인 변수명입니다. 이름을 읽으며 “전체 시설 표”, “마포구 시설 표”, “마포구 도서관 표”로 말해 보면 어느 결과가 다음 입력인지 따라가기 쉽습니다.

실행 전 예상 · 어떤 축이 바뀔까?

먼저 예상: 26개 항목에서 8개 항목만 남기는 일과 마포구만 남기는 일은 같은 변화일까요?

  1. 열 선택 뒤의 행 수가 유지될지 줄어들지 예상합니다.
  2. 지역 조건 선택 뒤의 열 수가 유지될지 줄어들지 예상합니다.
  3. 다음 출력에서 자신의 예상과 실제 shape를 비교할 준비를 합니다.

관찰할 것: 표가 작아졌다는 말 대신 행과 열 중 무엇이 바뀌었는지 말합니다.

다음 단계로 가기 전: 기존 셀의 값은 바꾸지 않습니다.

풀이와 확인 기준

열 선택은 같은 시설 기록에서 보여 줄 항목을 줄입니다. 지역 조건은 같은 항목을 가진 기록 중 일부를 남깁니다.

이번 수업의 열 선택에서는 행 수가 유지되고, 행 선택에서는 열 수가 유지됩니다. 두 축을 따로 추적합니다.

5-12분 · 셀 2: CSV를 읽고 첫 5행 보기

pandas는 표를 다루는 Python 라이브러리입니다. 준비 셀에서 import pandas as pd로 불러왔고, pd는 그 짧은 이름입니다. pd.read_csv가 헤더·쉼표·따옴표를 해석하여 DataFrame을 반환합니다. df =는 읽은 표에 이름을 붙입니다.

source_path와 source_encoding은 셀 1에서 준비한 파일 경로와 인코딩입니다. 업로드와 보관본 모두 아래의 같은 읽기 코드를 사용합니다. 이 셀에서 다른 파일명을 다시 입력하지 않습니다.

노트북 셀 2 · CSV 읽기

수정할 것: 수정 없이 실행합니다. 파일 경로는 셀 1에서 정한 값을 그대로 사용합니다.

성공 확인: 첫 5행에 문화시설명이 한글로 보입니다.

셀 2의 코드 · 같은 번호의 기존 셀을 실행하세요.

셀 2의 코드 · 같은 번호의 기존 셀을 실행하세요.
df = pd.read_csv(source_path, encoding=source_encoding)
display(df.head())

함수 호출이 표를 돌려주는 과정

6주차에는 함수에 입력을 주고 반환값을 변수로 받았습니다. 이번에도 같은 구조입니다. 입력이 이미지의 크기나 색 대신 파일의 위치와 문자 규칙이고, 반환값이 이미지 대신 DataFrame이라는 점이 달라집니다.

셀 2의 코드 읽기
표현하는 일출력 또는 다음 단계
pdpandas를 가리키는 짧은 이름준비 셀의 import pandas as pd에서 정했습니다.
read_csv(...)CSV 읽기 함수를 호출읽은 결과로 새로운 DataFrame을 반환합니다.
source_path첫 번째 인자로 파일 위치를 전달내 컴퓨터의 폴더가 아니라 Colab 안의 경로입니다.
encoding=source_encodingencoding이라는 이름의 인자에 값을 전달CP949로 저장한 원본을 올바른 한글로 읽습니다.
df = ...반환된 표를 df라는 이름으로 받음다음 셀에서 같은 표의 크기·열을 확인합니다.
df.head()앞부분만 골라 확인할 표를 반환원본 df 전체를 5행으로 덮어쓰지 않습니다.
display(...)전달한 표를 노트북 화면에 표시화면에 나타났다고 CSV 파일을 저장한 것은 아닙니다.

기억할 점 파일 경로 → read_csv → DataFrame → df라는 연결을 한 문장으로 설명합니다.

실행 결과를 읽기

head()는 앞 5행만 보여 줍니다. 첫 시설명이 한글로 보이는지 확인하세요. 보관본의 첫 시설은 DDP(동대문디자인플라자)입니다. 전체 파일의 행 수는 다음 셀에서 확인합니다.

FileNotFoundError 또는 source_path가 없다고 나오면?

셀 1의 준비 완료가 있는지 먼저 확인합니다. 새 런타임이라면 원본 CSV를 다시 업로드하고 셀 1 → 셀 2 순서로 실행합니다. 파일명은 셀 1에서만 고칩니다.

UnicodeDecodeError가 나오면?

원본과 보관본은 CP949입니다. 셀 1의 source_encoding이 cp949인지 확인하고 셀 1 → 셀 2를 실행합니다. 직접 UTF-8로 따로 저장한 파일만 utf-8-sig를 선택합니다.

read_csv의 출력과 head의 출력을 구분하기

셀 2의 첫 줄은 파일 전체를 읽어 df에 담습니다. 그다음 줄은 df에서 앞부분을 얻어 화면에 표시합니다. 화면에 5행이 보이는 것은 read_csv가 파일의 첫 5행만 읽었다는 뜻이 아닙니다. 전체 데이터를 메모리에 준비한 다음 확인하기 쉬운 일부를 보여 준 것입니다.

큰 표를 통째로 출력하면 화면이 길어지거나 일부 행·열이 생략되어 보입니다. head는 처음 읽을 때 열 구조와 대표적인 값이 맞는지 빠르게 확인하기 위한 미리보기입니다. 첫 다섯 시설만으로 전체 종류나 지역 분포를 판단하지 않고, 전체 크기와 열 이름은 다음 셀에서 별도로 확인합니다.

같은 셀 안의 두 반환값
pd.read_csv(...)

원본의 전체 표 반환
df가 이 표를 가리킴
보관본: 1,096 × 26

df.head()

앞 5행의 표 반환
display에 전달하여 표시
df 전체는 유지

출력을 작게 보여 주는 것과 작업 대상 자체를 작은 표로 바꾸는 것은 다른 행동입니다.

기억할 점 “화면에 보이는 표”와 “변수에 담긴 전체 표”를 구분해야 선택 결과를 오해하지 않습니다.

첫 출력에서 볼 네 가지 증거

출력의 맨 위에서 문화시설명·자치구 같은 예상한 열 이름이 보이는지 확인합니다. 다음으로 한글 시설명이 정상인지, 값이 맞는 열 아래에 들어 있는지, 왼쪽의 행 라벨과 데이터 열이 구분되는지 봅니다. 이 확인은 원본 전체의 정확성을 보증하지 않지만 잘못된 파일이나 읽기 설정을 초기에 찾는 데 도움이 됩니다.

보관본에서는 DDP(동대문디자인플라자), 우란2경, 구립은평뉴타운도서관이 앞부분에 있습니다. 자신의 최신 파일에서 순서가 다를 수는 있습니다. 이 경우 특정 시설명이 첫 줄에 없다는 이유만으로 실패로 판단하지 말고 자료명과 열 구조, 사용한 파일 버전을 먼저 확인합니다.

read_csv 결과에서 핵심 4열·앞 3행만 발췌 · 전체 출력은 노트북에서 확인
인덱스번호문화시설명주제분류자치구
01DDP(동대문디자인플라자)기타중구
12우란2경공연장성동구
23구립은평뉴타운도서관도서관은평구

기억할 점 읽기 성공의 증거는 표가 나타났다는 사실에 더해, 기대한 구조와 값이 제자리에 있다는 점입니다.

오류 읽기 · 실패 지점을 먼저 찾기

먼저 예상: read_csv 줄에서 오류가 났다면 마포구 조건을 바꾸는 것이 도움이 될까요?

  1. 오류가 난 셀 번호와 첫 실패 줄을 찾습니다.
  2. FileNotFoundError, UnicodeDecodeError, NameError 중 어떤 종류인지 읽습니다.
  3. 1교시의 준비 단계와 연결해 수정할 입력을 정합니다.

관찰할 것: 파일 읽기 이전의 문제와 조건 선택의 문제를 섞지 않습니다.

다음 단계로 가기 전: 기존 셀의 값은 바꾸지 않습니다.

풀이와 확인 기준

파일을 읽기 전에 실패했다면 아직 지역을 고를 표가 준비되지 않았습니다. 조건값을 바꾸어도 파일 위치나 인코딩 문제는 해결되지 않습니다.

경로는 셀 1에서, 인코딩도 셀 1에서 확인합니다. 수정한 뒤 준비 셀과 읽기 셀을 다시 실행해 입력에서부터 연결을 복구합니다.

12-18분 · 셀 3: 전체 크기와 열 이름 확인하기

5행이 보였다고 5행짜리 파일은 아닙니다. shape는 전체 표의 (행 수, 열 수)를 알려 줍니다. columns는 실제 열 이름을 알려 주고, tolist()는 이름을 리스트로 보여 줍니다.

노트북 셀 3 · 표의 크기와 열 이름 확인

수정할 것: 수정 없이 실행합니다.

성공 확인: 수업 보관본은 (1096, 26)과 26개 열 이름이 표시됩니다.

셀 3의 코드 · 같은 번호의 기존 셀을 실행하세요.

직접 해보기
print("행, 열:", df.shape)
print("열 이름:", df.columns.tolist())

속성과 메서드를 읽는 기준

점 뒤에 붙은 표현이 모두 같은 방식으로 실행되지는 않습니다. 표가 가진 정보를 읽는 속성과 특정 작업을 호출하는 메서드를 구분하면 괄호 오류를 줄일 수 있습니다. 이전 이미지 수업의 image.size와 image.resize(...)를 떠올려 봅니다.

셀 3의 코드 읽기
표현하는 일출력 또는 다음 단계
df.shape표의 크기라는 속성(행 수, 열 수) 순서의 두 값입니다.
df.columns열 이름을 담은 속성데이터의 값이 아니라 항목의 이름입니다.
df.columns.tolist()열 이름을 리스트로 변환하는 메서드이름 전체를 한 줄의 목록으로 확인합니다.
print("행, 열:", df.shape)안내 문장과 실제 값을 함께 출력행 수를 헤더까지 포함해 세지 않습니다.

기억할 점 괄호가 없는 shape와 호출 괄호가 있는 head()를 구분합니다. 암기보다 각각 무엇을 하는지 먼저 말해 봅니다.

보관본 출력에서 확인할 것
출력뜻
(1096, 26)시설 기록 1,096행, 항목 26열
문화시설명 · 주제분류 · 자치구다음 선택 코드에 그대로 쓸 열 이름
직접 해보기

값을 읽고 다음으로

행 수와 열 수를 구분해 말합니다. 열 이름에서 문화시설명과 자치구를 찾습니다. 최신 CSV는 행 수가 달라도 되며, 숫자를 맞추려고 원본을 삭제하지 않습니다.

shape에는 왜 괄호가 없을까?

shape는 표의 크기를 제공하는 속성이므로 ()가 없습니다. head는 실행하는 메서드라 head()처럼 괄호를 붙입니다. 지금은 두 사용법을 구분하면 됩니다.

shape를 읽을 때 헤더와 인덱스를 세지 않는다

shape는 데이터 표의 (행 수, 열 수)입니다. 화면에는 헤더 줄과 맨 왼쪽 행 라벨이 함께 보이지만 이들은 데이터 값의 두 축을 설명하는 표시입니다. 보관본의 (1096, 26)에 헤더를 더해 1,097행이라고 쓰거나 인덱스를 더해 27열이라고 쓰지 않습니다.

반면 원본의 번호는 실제 데이터 열입니다. 현재 첫 기록에서는 인덱스 0 옆에 번호 1이 보이지만, 이 관계를 모든 행에 적용하면 안 됩니다. 두 번째 조건까지 적용한 뒤에는 원본에서 남은 행 라벨과 번호 값이 서로 다르게 나타납니다. 인덱스는 표의 라벨이고 번호는 원본이 제공한 항목이라고 구분합니다.

크기를 읽는 세 상황
출력정확한 해석아직 알 수 없는 것
(1096, 26)데이터 1,096행, 항목 26개값이 모두 정확하거나 최신인지
(55, 8)선택된 기록 55개, 항목 8개55개가 모두 내 방문 목적에 맞는지
(0, 8)열 구조는 있으나 선택된 기록은 없음조건 표기가 틀렸는지 실제 해당 기록이 없는지

기억할 점 shape는 구조의 빠른 확인 수단입니다. 값의 의미와 정확성은 별도로 확인합니다.

열 이름은 사람이 이해하는 제목이면서 코드의 정확한 키다

우리는 “시설 이름”과 “문화시설명”을 비슷한 뜻으로 이해하지만, 코드는 실제 존재하는 열 이름으로 선택합니다. 문화시설명이라고 저장된 열을 시설명으로 요청하면 자동으로 동의어를 추측해 주지 않습니다. columns 출력에서 정확한 표기를 찾는 습관이 필요합니다.

공백도 문자열의 일부입니다. 주제분류와 주제 분류, 자치구와 자치구 뒤에 공백이 붙은 문자열은 다릅니다. 눈으로 비슷해 보이는 이름을 임의로 고치기 전에 원본 열 목록을 확인합니다. 공통 예제에서는 제공된 표기 그대로 사용하고, 다른 자료로 옮길 때만 그 자료의 이름에 맞춥니다.

읽기용 문법 비교 · 실제 실행은 기존 셀 2·3에서 합니다.

읽기용 문법 비교 · 실제 실행은 기존 셀 2·3에서 합니다.
df.shape              # 속성: 표의 크기를 읽음
df.head()             # 메서드: 앞부분을 가져오는 동작을 호출
df.columns.tolist()  # 열 이름 목록을 리스트로 변환

기억할 점 shape에는 호출 괄호가 없고 head()에는 있습니다. 하는 일과 함께 읽으면 형태를 기억하기 쉽습니다.

비교 실습 · 5행을 2행으로 보면 원본도 줄어들까?

먼저 예상: 셀 2의 head()를 head(2)로 바꾼 뒤 셀 3을 실행하면 전체 행 수가 2가 될까요?

  1. 셀 2의 display(df.head()) 한 줄만 display(df.head(2))로 바꾸고 실행합니다.
  2. 첫 2행만 보이는지 확인한 뒤 셀 3을 실행합니다.

관찰할 것: 화면에 보이는 행 수와 df.shape의 첫 번째 값을 구분합니다.

다음 단계로 가기 전: 셀 2를 원래의 head()로 돌리고 셀 2 → 셀 3을 실행합니다.

풀이와 확인 기준

head(2)는 처음 두 행을 미리보기로 돌려줄 뿐 df 전체를 바꾸지 않습니다. 보관본의 df.shape는 여전히 (1096, 26)입니다.

만약 df = df.head(2)라고 대입하면 df라는 이름이 두 행짜리 표를 가리키게 됩니다. 이번 실험에서는 대입문을 바꾸지 않습니다.

18-27분 · 셀 4~5: 두 열에서 여덟 열로 늘리기

먼저 시설명과 자치구만 골라 읽기 쉬운 표를 만듭니다. ["문화시설명", "자치구"]는 두 이름을 담은 리스트이고, 바깥의 df[ ... ]는 그 열들을 선택합니다. 한 번에 두 열을 고르는 표현입니다.

노트북 셀 4 · 두 열 선택

수정할 것: 공통 예제의 문화시설명·자치구를 그대로 사용합니다.

성공 확인: 행 수는 그대로이고 열은 2개입니다. 보관본은 (1096, 2)입니다.

셀 4의 코드 · 같은 번호의 기존 셀을 실행하세요.

셀 4의 코드 · 같은 번호의 기존 셀을 실행하세요.
preview = df[["문화시설명", "자치구"]]
display(preview.head())
print("행, 열:", preview.shape)

대괄호 두 겹의 역할

열 두 개를 고를 때 대괄호가 두 겹으로 보여도 한 가지 동작을 두 번 반복하는 것은 아닙니다. 안쪽은 열 이름을 묶는 리스트이고 바깥쪽은 그 리스트를 기준으로 표를 선택하는 연산입니다.

셀 4의 코드 읽기
표현하는 일출력 또는 다음 단계
["문화시설명", "자치구"]두 열 이름을 순서대로 담은 리스트앞에 쓴 이름이 결과 표에서도 왼쪽에 옵니다.
df[["문화시설명", "자치구"]]df에서 리스트의 열들을 선택행은 유지되고 두 열의 DataFrame이 나옵니다.
preview = ...두 열짜리 결과에 이름을 붙임이 이름을 출력하거나 크기를 확인할 수 있습니다.
preview.shape선택 결과의 크기를 확인보관본은 (1096, 2). df는 여전히 (1096, 26)입니다.

기억할 점 열을 고르는 기준은 값이 아니라 열 이름입니다. 열의 개수와 행의 개수를 함께 확인합니다.

결과의 데이터 열은 두 개입니다. 맨 왼쪽의 숫자는 pandas의 인덱스라는 행 라벨이며 데이터 열 개수에 포함하지 않습니다. 원본의 번호 열과도 별개입니다.

같은 방법으로 최종 목록에 사용할 8개 열을 고릅니다. 긴 리스트에 keep_columns라는 이름을 붙이면 다시 쓰기 쉽습니다. .copy()는 선택한 표를 별도로 복사하는 코드입니다. 이 결과 places를 다음 조건 선택의 출발점으로 사용합니다.

노트북 셀 5 · 목록에 쓸 8개 열 선택

수정할 것: keep_columns의 8개 열을 그대로 사용합니다.

성공 확인: 행 수는 그대로이고 열은 8개입니다. 보관본은 (1096, 8)입니다.

셀 5의 코드 · 같은 번호의 기존 셀을 실행하세요.

셀 5의 코드 · 같은 번호의 기존 셀을 실행하세요.
keep_columns = ["번호", "문화시설명", "주제분류", "자치구", "주소", "무료구분", "위도", "경도"]
places = df[keep_columns].copy()
display(places.head())
print("행, 열:", places.shape)

긴 선택 목록에 이름 붙이기

8개 열을 대괄호 안에 매번 직접 나열해도 같은 선택을 할 수 있습니다. 리스트를 변수에 담으면 열의 목적을 설명하기 쉽고, 목록을 한 곳에서 확인할 수 있습니다. keep_columns는 pandas가 정한 이름이 아니라 수업에서 붙인 변수명입니다.

셀 5의 코드 읽기
표현하는 일출력 또는 다음 단계
keep_columns = [...]필요한 열 이름 8개를 리스트에 저장결과의 열 순서를 함께 정합니다.
df[keep_columns]리스트에 들어 있는 이름의 열을 선택문자열 "keep_columns"라는 열을 찾는 것이 아닙니다.
.copy()선택 결과를 별도 작업 표로 복사이후 결과에 다른 이름을 붙이고 비교하기 쉽게 합니다.
places = ...조건 선택에 사용할 전체 시설 표모든 자치구의 행을 가진 출발점입니다.

기억할 점 df는 원본을 읽은 전체 표, places는 후보 목록에 필요한 열을 모은 전체 표입니다.

행은 그대로, 열만 바뀝니다

보관본에서 df는 (1096, 26), preview는 (1096, 2), places는 (1096, 8)입니다. 열을 선택했으므로 행 수는 같습니다. 위도·경도는 다음 주 지도 학습에 쓰기 위해 남깁니다.

KeyError가 나오면?

셀 3의 열 이름과 비교합니다. “주제분류”와 “주제 분류”는 다릅니다. 공통 예제에서는 제공된 8개 이름을 그대로 사용합니다.

한 열과 한 열짜리 표는 어떻게 다를까?

DataFrame은 행과 열의 두 축을 가진 표입니다. df["자치구"]처럼 한 이름을 주면 이번 데이터에서는 Series라는 한 축의 열 데이터를 얻습니다. df[["자치구"]]처럼 이름 리스트를 주면 한 열을 가진 DataFrame을 얻습니다. 값이 비슷하게 보여도 결과의 형태가 다릅니다.

이번에는 여러 항목을 함께 보관할 결과를 만들므로 열 이름 리스트를 사용합니다. 다음 조건 비교에서는 각 행의 자치구 값을 살펴야 하므로 한 열을 꺼냅니다. 문법을 무작정 외우기보다 “표를 만들려는가, 각 행의 한 값을 비교하려는가?”를 먼저 생각합니다.

안쪽 리스트와 바깥쪽 선택
안쪽 · 선택 목록

["문화시설명", "자치구"]
어떤 열을 어떤 순서로 남길지 적은 리스트

바깥쪽 · 표에 적용

df[선택할_목록]
그 이름의 열을 가진 새 표를 얻음

실제 셀 4에서는 두 표현을 합쳐 df[["문화시설명", "자치구"]]로 씁니다. 그림의 선택할_목록은 설명용 표현입니다.

기억할 점 대괄호의 개수만 세기보다 안쪽 값의 종류와 바깥쪽 연산의 역할을 읽습니다.

열 목록을 변수로 빼도 선택의 의미는 같다

셀 4는 두 이름의 리스트를 직접 썼고, 셀 5는 여덟 이름을 keep_columns에 담았습니다. df[keep_columns]를 실행할 때 Python은 변수에 담긴 리스트를 사용합니다. 반대로 df["keep_columns"]라고 쓰면 keep_columns라는 이름의 열 하나를 찾습니다. 변수와 문자열은 다른 뜻입니다.

keep_columns에 적은 순서가 결과의 열 순서가 됩니다. 번호를 먼저 두면 원본과 대조하기 쉽고, 문화시설명을 앞에 두면 후보를 읽기 쉽습니다. 이번 공통 과제는 비교와 검사에 사용할 8개 이름과 순서를 통일합니다. 최종 자료의 목적에 따라 출력 열을 설계할 수 있다는 점도 함께 기억합니다.

선택 뒤에도 남는 두 축
표 이름시설 기록의 범위표시 항목
df모든 시설 기록원본 26개
preview모든 시설 기록문화시설명·자치구 2개
places모든 시설 기록keep_columns의 8개

기억할 점 열을 줄였다고 일부 지역의 시설이 사라진 것은 아닙니다. places에는 여전히 모든 지역이 있습니다.

비교 실습 · 열의 순서만 바꾸면?

먼저 예상: 셀 4의 두 열 이름 순서를 바꾸면 시설 기록의 순서도 바뀔까요?

  1. 셀 4의 리스트를 ["자치구", "문화시설명"]으로 바꾸어 실행합니다.
  2. 두 열의 왼쪽·오른쪽 위치와 첫 시설명을 원래 결과와 비교합니다.

관찰할 것: 열의 위치는 바뀌지만 첫 기록과 행 수는 유지되는지 봅니다.

다음 단계로 가기 전: 리스트를 ["문화시설명", "자치구"]로 돌려 셀 4를 실행한 뒤 셀 5로 갑니다.

풀이와 확인 기준

열 선택 리스트의 순서가 결과의 열 순서가 됩니다. 행 정렬 명령을 실행하지 않았으므로 기록의 순서는 그대로입니다.

행의 순서와 열의 순서는 별개의 축입니다. 표 모양이 달라 보여도 무엇이 바뀌었는지 축별로 확인합니다.

코드 읽기 · 따옴표 하나가 바꾸는 뜻

먼저 예상: df[keep_columns]와 df["keep_columns"]가 같은 결과를 낼까요?

  1. keep_columns가 정의된 셀 5의 줄을 찾습니다.
  2. 그 변수의 값이 문자열인지 리스트인지 말합니다.
  3. 따옴표 안의 이름을 실제 열 목록에서 찾아봅니다.

관찰할 것: 코드를 실행하지 않고도 변수 참조와 열 이름 문자열을 구분해 봅니다.

다음 단계로 가기 전: 기존 셀의 값은 바꾸지 않습니다.

풀이와 확인 기준

첫 표현은 변수에 담긴 8개 열 이름 리스트를 선택 기준으로 사용합니다. 두 번째 표현은 keep_columns라는 이름의 열을 찾습니다.

원본에 그 이름의 열이 없으므로 두 번째 표현은 KeyError가 납니다. 오류를 없애려고 원본에 새 열을 만드는 것이 아니라 의도한 표현을 확인합니다.

27-36분 · 셀 6: 마포구인 행만 선택하기

이제 행을 고릅니다. places["자치구"]는 각 시설의 자치구 값이고, == "마포구"는 그 값이 마포구인지 묻습니다. 비교 결과는 행마다 True 또는 False로 나옵니다. 이 조건표에 is_mapo라는 이름을 붙입니다.

조건표를 읽는 예
자치구 값마포구인가?선택 결과
중구False남기지 않음
성동구False남기지 않음
마포구True남김

.loc[is_mapo]는 True인 행만 고릅니다. 첫 출력은 조건표의 앞 10개 값, 그다음 출력은 선택한 시설입니다. 두 출력을 구분해서 봅니다.

노트북 셀 6 · 마포구 선택

수정할 것: 마포구를 그대로 사용합니다. 자기 지역은 3교시에서 고릅니다.

성공 확인: 자치구가 마포구인 행만 남습니다. 보관본은 (55, 8)입니다.

셀 6의 코드 · 같은 번호의 기존 셀을 실행하세요.

셀 6의 코드 · 같은 번호의 기존 셀을 실행하세요.
is_mapo = places["자치구"] == "마포구"
display(is_mapo.head(10))
mapo_places = places.loc[is_mapo].copy()
display(mapo_places.head())
print("행, 열:", mapo_places.shape)

조건을 만드는 줄과 선택하는 줄

조건 비교만으로는 행이 사라지지 않습니다. 먼저 각 행의 해당 여부를 계산하고, 그 결과를 실제 선택에 사용합니다. is_mapo가 무엇을 담는지 보면 .loc가 어떤 기록을 남기는지 설명할 수 있습니다.

셀 6의 코드 읽기
표현하는 일출력 또는 다음 단계
places["자치구"]자치구 열의 값을 가져옴중구·성동구·마포구 등의 값이 있는 한 열입니다.
== "마포구"각 값이 마포구와 같은지 비교문자열 전체가 정확히 같은 행만 True입니다.
is_mapo = ...True/False 결과를 변수로 저장시설 목록이 아니라 선택에 쓸 조건표입니다.
is_mapo.head(10)조건표의 앞 10개를 확인True와 False가 원래 행 라벨에 대응합니다.
places.loc[is_mapo]True에 해당하는 행을 선택보관본에서 55개 시설이 남습니다.
mapo_places = ...지역 선택 결과를 보관다음 셀은 이 표에서 도서관을 고릅니다.

기억할 점 비교는 “남길지”를 정하고, .loc는 그 판단에 따라 행을 가져옵니다.

출력 비교

보관본은 places의 1,096행 중 55행이 mapo_places에 남습니다. 열은 여전히 8개입니다. 자치구 값이 모두 마포구인지 확인합니다.

선택 결과의 인덱스가 0, 1, 2로 이어지지 않으면?

선택 전 행 라벨을 유지하기 때문입니다. 일부 행을 골랐으므로 번호가 띄엄띄엄 보이는 것이 정상입니다. 원본에서 어떤 기록이었는지 대조할 때 도움이 됩니다.

조건표는 작은 시설 목록이 아니다

places["자치구"] == "마포구"는 모든 행을 검사하여 같은 수의 True/False 값을 만듭니다. 마포구 행만 모은 표는 아직 아닙니다. 예를 들어 1,096행에 비교하면 조건표에도 각 행에 대응하는 1,096개의 판단이 있습니다. 그중 True인 판단을 .loc에 전달해야 실제 행 선택이 일어납니다.

이 조건표를 불리언 마스크라고도 부릅니다. 마스크는 남길 기록의 위치를 가리키는 기준이라고 이해하면 됩니다. 조건표 자체에는 문화시설명이나 주소가 없으므로 방문 목록으로 사용할 수 없습니다. 원래 표에서 True 행의 모든 데이터 열을 가져온 결과가 mapo_places입니다.

원본 일부에 조건을 적용한 실제 예
원본 인덱스시설명자치구자치구 == "마포구"행 선택
0DDP(동대문디자인플라자)중구False제외
1우란2경성동구False제외
2구립은평뉴타운도서관은평구False제외
7연세대학교 김대중도서관마포구True남김

기억할 점 조건 계산의 길이와 선택된 결과의 행 수는 다른 값입니다.

=는 이름 붙이기, ==는 같다고 묻기

is_mapo = places["자치구"] == "마포구"에는 두 종류의 등호가 있습니다. 오른쪽의 ==는 각 값이 마포구와 같은지를 계산합니다. 왼쪽의 =는 계산된 조건표에 is_mapo라는 이름을 붙입니다. 읽을 때는 오른쪽에서 무엇을 계산하는지 먼저 보고, 왼쪽에 어떤 이름으로 보관하는지 확인합니다.

조건 문자열은 전체가 같아야 합니다. 마포와 마포구는 다르며, 마포구 뒤에 공백이 붙어도 다릅니다. 부분 문자열을 찾는 별도의 방법도 있지만 이번 조건은 정확히 같은 자치구 값을 고르는 비교입니다. 결과가 0행이면 오류 문구가 없더라도 조건이 의도와 맞는지 다시 확인합니다.

코드의 의미를 읽는 순서 · 화살표가 포함된 설명용 도식

코드의 의미를 읽는 순서 · 화살표가 포함된 설명용 도식
places["자치구"]  →  각 행의 지역 값
== "마포구"        →  행마다 True 또는 False
is_mapo = ...       →  그 판단에 이름 붙이기
places.loc[is_mapo] →  True인 행의 데이터 가져오기

기억할 점 비교하는 줄과 선택하는 줄을 따로 설명할 수 있으면 조건을 바꾸어도 흐름을 따라갈 수 있습니다.

선택 후 인덱스가 띄엄띄엄이어도 정상이다

행 선택은 기존 표에서 일부 기록을 가져오는 일입니다. 선택 전 라벨을 유지하므로 결과의 왼쪽 숫자가 0, 1, 2로 연속하지 않을 수 있습니다. 이를 행 누락 오류라고 단정하지 않습니다. 조건을 만족하지 않는 행을 제외했기 때문에 생기는 자연스러운 결과입니다.

인덱스가 7인 기록을 “선택 결과의 여덟 번째 시설”이라고 읽으면 안 됩니다. 7은 현재 보이는 표에서의 순서가 아니라 유지된 행 라벨입니다. 표의 위치와 라벨은 다른 개념입니다. 이번 실습에서는 직접 번호로 행을 집기보다 조건표로 선택하므로 원래 라벨을 그대로 두어도 됩니다.

기억할 점 출력에서 행 라벨, 번호 열, 화면에 보이는 순서를 각각 구분합니다.

비교 실습 · 마포와 마포구는 같은 조건일까?

먼저 예상: 셀 6의 비교값을 "마포"로 바꾸면 마포구 기록이 선택될까요?

  1. 셀 6의 비교 문자열만 "마포"로 바꾸고 실행합니다.
  2. 조건표와 선택 결과의 크기를 봅니다. 실행 오류와 0행 결과를 구분합니다.

관찰할 것: 보관본에서 (0, 8)이 나오는지, 열 이름은 남는지 확인합니다.

다음 단계로 가기 전: 반드시 "마포구"로 되돌리고 셀 6을 실행해 55행을 확인한 다음 셀 7을 실행합니다.

풀이와 확인 기준

==는 문자열 전체가 같은지를 비교합니다. 보관본 자치구의 값은 “마포구”이므로 “마포”와 같지 않습니다.

0행이어도 8개 열을 가진 DataFrame입니다. 값이 일부 비어 있는 표와 행 자체가 없는 표는 다릅니다.

36-44분 · 셀 7: 마포구에서 도서관 고르기

앞 셀의 mapo_places에는 이미 마포구 시설만 있습니다. 이번에는 그 결과에서 주제분류가 도서관인 행을 고릅니다. 앞 단계의 결과에 조건 하나를 더 적용하는 방식입니다.

노트북 셀 7 · 마포구에서 도서관 선택

수정할 것: 앞 셀의 mapo_places에서 도서관을 그대로 고릅니다.

성공 확인: 마포구이면서 도서관인 행만 남습니다. 보관본은 (5, 8)입니다.

셀 7의 코드 · 같은 번호의 기존 셀을 실행하세요.

직접 해보기
is_library = mapo_places["주제분류"] == "도서관"
mapo_libraries = mapo_places.loc[is_library].copy()
display(mapo_libraries)
print("행, 열:", mapo_libraries.shape)

이전 결과에 조건을 한 번 더 적용

두 번째 조건의 출발점이 중요합니다. mapo_places는 이미 마포구만 남은 표이므로 여기서 도서관을 고르면 두 조건을 모두 만족합니다. 두 번째 줄의 문법은 앞 셀과 같고, 사용하는 표와 비교할 열만 달라집니다.

셀 7의 코드 읽기
표현하는 일출력 또는 다음 단계
mapo_places["주제분류"]마포구 표에서 종류 열을 가져옴다른 자치구의 시설은 이미 이 표에 없습니다.
== "도서관"도서관인지 행마다 비교문화시설명에 도서관이라는 글자가 있는지 찾는 것은 아닙니다.
mapo_places.loc[is_library]조건을 만든 바로 그 표에서 행 선택조건표의 행 라벨과 대상 표가 대응합니다.
mapo_libraries두 조건이 적용된 공통 결과보관본은 5행 × 8열이며 개인 결과와 별도로 남습니다.

기억할 점 어떤 조건인가와 함께, 어느 표에서 그 조건을 적용하는지도 확인합니다.

수업 보관본에서 남는 기록
단계사용하는 표행 × 열
필요한 열 선택places1,096 × 8
마포구 선택mapo_places55 × 8
그중 도서관 선택mapo_libraries5 × 8
직접 해보기

결과에서 실제 시설 찾기

보관본이라면 마포중앙도서관을 찾아봅니다. 출력의 자치구가 마포구이고 주제분류가 도서관인지 확인합니다. 최신 원본은 개수가 달라도 두 조건이 맞으면 됩니다.

셀 7에서 df를 사용하면 어떻게 달라질까?

df 전체에서 도서관을 고르면 다른 자치구도 포함됩니다. 셀 7은 마포구로 좁힌 mapo_places에서 시작하기 때문에 두 조건을 모두 만족하는 결과가 됩니다.

두 조건의 교집합을 순서대로 만드는 방법

셀 6은 모든 시설에서 마포구를 골랐고 셀 7은 그 결과에서 도서관을 골랐습니다. 따라서 최종 기록은 두 질문에 모두 True인 시설입니다. 마포구이거나 도서관이면 된다는 뜻과는 다릅니다. 두 조건 중 하나만 만족하는 다른 지역의 도서관이나 마포구 공연장은 최종 표에 남지 않습니다.

핵심은 두 번째 조건의 출발 표입니다. places에서 도서관을 고르면 서울의 여러 지역이 다시 포함됩니다. mapo_places에서 도서관을 고르면 이미 적용한 지역 조건이 유지됩니다. 결과가 이상할 때는 조건 문자열만 보지 말고 비교의 대상과 .loc 앞에 적힌 표 이름을 함께 확인합니다.

현재 단계의 결과가 다음 단계의 입력
places

모든 지역 · 모든 종류
1,096행 × 8열

mapo_places

마포구 · 모든 종류
55행 × 8열

mapo_libraries

마포구 · 도서관
5행 × 8열

2026-10-21 보관본 기준. 조건을 더할 때 행이 줄고 선택해 둔 8개 열은 유지됩니다.

기억할 점 “어떤 조건인가?”와 “어느 표에서 시작하는가?”를 한 쌍으로 읽습니다.

단계 비교 · 조건을 적용하면 어떤 기록이 남을까?

아래 버튼으로 공통 예제의 세 단계를 비교합니다. 2026-10-21 수업 보관본의 실제 기록을 사용합니다. 표시하는 열은 읽기 쉬운 4개이며, 노트북의 각 표는 8개 데이터 열을 유지합니다. 이 화면은 Colab의 실행 상태를 바꾸지 않습니다.

기록을 불러오는 중입니다. 아래 정적 결과표로도 마지막 단계의 시설을 확인할 수 있습니다.

기록을 불러오는 중입니다. 아래 정적 결과표로도 마지막 단계의 시설을 확인할 수 있습니다.
places · 1,096행 × 8열

선택한 단계의 앞 8행
원본 인덱스문화시설명주제분류자치구무료구분

분류값과 시설 이름을 구분해 결과 읽기

도서관 조건은 시설 이름에 도서관이라는 글자가 있는지를 찾지 않습니다. 주제분류 열의 값이 도서관인지 비교합니다. 실제 결과에는 서울특별시교육청 마포평생학습관처럼 시설명만 보고는 바로 예상하지 못할 수 있는 이름도 들어 있습니다. 결과가 틀렸다고 판단하기 전에 어떤 열을 비교했는지 확인합니다.

이 표는 해당 원본의 분류를 그대로 사용합니다. 기관의 실제 기능을 새로 판정하거나 이름을 근거로 재분류하지 않았습니다. 분류가 자신의 프로젝트 목적과 맞는지 검토하는 것은 별도의 판단 단계입니다. 이번 공통 실습에서는 조건과 원본 값의 일치부터 확인합니다.

공통 예제의 실제 5개 결과 · 8개 데이터 열 중 4개를 표시
인덱스번호문화시설명주제분류자치구
766연세대학교 김대중도서관도서관마포구
515501서울특별시교육청 마포평생학습관도서관마포구
727715마포중앙도서관도서관마포구
840828마포소금나루도서관도서관마포구
869859마포구립서강도서관도서관마포구

기억할 점 결과의 낯선 이름도 조건에 맞을 수 있습니다. 이름의 인상보다 선택에 사용한 열을 근거로 판단합니다.

예상 문제 · 마포구에서 은평구로 한 번 더 고르면?

먼저 예상: 마포구만 남은 mapo_places에서 자치구가 은평구인 행을 찾으면 어떤 결과일까요?

  1. 현재 mapo_places에 존재하는 자치구 값을 말합니다.
  2. 그 안에 은평구 값이 있을 수 있는지 판단합니다.
  3. 3교시에서 자기 지역을 고르려면 어느 표로 돌아가야 할지 정합니다.

관찰할 것: 앞 조건을 유지하는 좁히기와 전체에서 새로 선택하는 작업을 구분합니다.

다음 단계로 가기 전: 기존 셀의 값은 바꾸지 않습니다.

풀이와 확인 기준

마포구 표 안에는 은평구 행이 없으므로 0행입니다. 지역 문자열만 바꾸어도 출발 표가 그대로면 다른 지역이 생기지 않습니다.

다른 지역의 개인 결과는 모든 지역이 들어 있는 places에서 시작해야 합니다. 이것이 셀 8에서 places를 다시 사용하는 이유입니다.

44-50분 · 공통 예제를 설명하고 3교시 준비하기

이번 교시는 셀 7에서 멈춥니다. 원본에서 8개 열을 고르고, 마포구를 고른 뒤, 그중 도서관을 골랐습니다. 셀 4~7의 출력으로 “열을 고를 때는 행 수가 같고, 조건으로 행을 고를 때는 열 수가 같다”는 점을 확인합니다.

2교시 완료 기준

공통 예제의 각 표가 어디에서 만들어졌는지 말할 수 있고, 보관본에서 1,096행 → 55행 → 5행을 확인했다면 완료입니다. 아직 개인 선택 이유를 작성하거나 CSV를 저장하지 않습니다. 다음 교시는 같은 노트북의 셀 8부터 시작합니다.

중간 셀에서 NameError가 나면?

그 셀에서 쓰는 표를 만든 앞 셀이 실행되지 않았을 수 있습니다. 이름을 임의로 바꾸지 말고 셀 1의 준비 상태를 확인한 뒤 셀 2부터 7까지 순서대로 실행합니다.

변수마다 어떤 상태가 남아 있는지 추적하기

셀 7까지 실행했다고 이전 표들이 자동으로 사라지는 것은 아닙니다. df는 전체 원본, preview는 두 열 표, places는 여덟 열 표, mapo_places는 지역 선택 결과, mapo_libraries는 두 조건 결과를 가리킵니다. 서로 다른 이름에 결과를 보관했기 때문에 단계별로 비교할 수 있습니다.

앞 셀을 다시 실행하면 그 셀이 만든 변수는 새 결과로 바뀝니다. 그러나 이미 계산해 둔 뒤쪽 변수까지 자동으로 갱신되지는 않습니다. 예를 들어 셀 6을 바꾼 뒤 셀 7을 실행하지 않으면 화면의 mapo_libraries는 이전 계산일 수 있습니다. 입력을 고친 지점부터 이어지는 셀을 다시 실행해야 합니다.

2교시 말에 설명할 수 있어야 하는 상태
이름만든 셀의미다음 사용
df2읽은 전체 표구조 확인·열 선택
preview4시설명·자치구 미리보기열 선택 연습
places5전체 시설의 8개 항목공통 조건과 개인 조건의 출발점
mapo_places6마포구 시설그중 도서관 선택
mapo_libraries7마포구 도서관공통 결과 확인

기억할 점 노트북은 위에서 아래로 읽고, 수정한 입력부터 필요한 결과까지 다시 실행합니다.

설명 문제 · 다섯 행이 나온 이유 말하기

먼저 예상: “코드를 실행했더니 다섯 개가 나왔다”보다 구체적으로 결과를 설명하려면 무엇을 말해야 할까요?

  1. 원본의 기록 단위와 사용할 열을 말합니다.
  2. 마포구 조건과 도서관 조건이 적용되는 순서를 말합니다.
  3. 최종 표에서 두 조건의 값과 시설 하나를 근거로 듭니다.

관찰할 것: 숫자를 외워 말하기보다 입력·조건·결과를 연결해 설명합니다.

다음 단계로 가기 전: 기존 셀의 값은 바꾸지 않습니다.

풀이와 확인 기준

“문화시설 기록에서 8개 항목을 남기고 자치구가 마포구인 행을 고른 뒤, 주제분류가 도서관인 행을 골랐다”라고 설명할 수 있습니다.

보관본의 결과는 5행 × 8열이며 마포중앙도서관 등이 포함됩니다. 다른 버전에서 개수가 달라도 같은 조건의 의미를 확인해야 합니다.

50-60분 · 선택 참고: 자료형과 빈 값 살펴보기

필수 흐름이 끝난 뒤 시간이 남으면 교수자 시연으로 df.dtypes와 df.isna().sum()을 봅니다. 각각 열의 자료형과 빈 값의 수를 알려 줍니다. 필수 셀 2~7에 코드를 추가할 필요는 없습니다.

빈 값이 없으면 모든 좌표를 숫자로 쓸 수 있을까?

보관본의 한국미술관 위도에는 37.5718961547884~2라는 값이 있습니다. 비어 있지 않지만 정상적인 숫자는 아닙니다. 이 값 때문에 위도가 문자열로 읽힙니다. 빈 값 확인과 숫자 형식 검사는 다른 일이며 다음 주 정제에서 이어서 다룹니다.

관람료가 비어 있으면 무료일까?

빈 값은 비용이 기록되지 않았다는 뜻일 수 있습니다. 0원과 같은 뜻으로 처리하지 않습니다. 실제 방문 정보는 시설 홈페이지에서 확인합니다.

오류 메시지를 수정 위치로 연결하는 연습

오류가 나면 마지막 출력의 색만 보고 코드를 여러 곳 바꾸기 쉽습니다. 먼저 오류 이름, 실패한 줄, 그 줄이 사용한 변수를 읽습니다. 그다음 필요한 입력이 준비되었는지 거슬러 확인합니다. 한 원인을 고친 뒤 다시 실행해야 어떤 수정이 효과가 있었는지 알 수 있습니다.

이번 흐름에서 자주 만나는 증상
증상의심할 원인확인과 복구
NameError: places셀 5 미실행 또는 런타임 초기화준비 상태 확인 → 셀 2~7 순서 실행
KeyError: 주제 분류열 이름 오타셀 3 columns 확인 → 주제분류로 수정
TypeError: tuple is not callableshape()처럼 속성을 호출shape로 수정 → 해당 셀 실행
코드는 실행되지만 0행정확한 값 불일치 또는 해당 기록 없음조건 문자열·출발 표 확인
조건을 고쳤는데 결과가 그대로뒤쪽 셀 미실행수정한 셀부터 결과 셀까지 재실행

기억할 점 실행 오류, 정상적인 빈 결과, 오래된 출력은 서로 다른 상황입니다.

같은 두 조건을 한 번에 쓰는 표현은 다음 단계의 참고

이번 필수 실습은 중간 결과를 보면서 두 번 선택하는 방식입니다. 익숙해진 뒤에는 동일한 출발 표에서 만든 두 조건을 &로 연결할 수도 있습니다. 각 비교를 괄호로 감싸고 같은 표의 행에 대응하도록 만든다는 점이 중요합니다. 지금은 셀 6·7을 이 표현으로 교체할 필요가 없습니다.

선택 참고 · 같은 두 조건의 뜻을 읽는 예시, 필수 셀 변경 없음

선택 참고 · 같은 두 조건의 뜻을 읽는 예시, 필수 셀 변경 없음
places.loc[
    (places["자치구"] == "마포구")
    & (places["주제분류"] == "도서관")
]

기억할 점 짧게 쓰는 것보다 조건이 적용되는 범위를 설명할 수 있는 것이 먼저입니다.

공식 자료

이 페이지의 목차