pandas로 표 데이터를 쉽게 사용하기 用 pandas 更轻松地处理表格数据
어제의 Excel이 오늘은 CSV다昨天的 Excel 今天变成 CSV
4-1에서 사용한 60줄 자료를 다시 씁니다. 표현하는 방법이 다를 뿐, 머리글과 값은 같습니다. Excel에서는 값이 칸 안에 보였지만, CSV에서는 같은 값이 쉼표로 나뉜 글자 줄로 저장됩니다. 이번 시간에는 pandas가 이 글자 줄을 다시 표로 읽어 내는 과정을 살펴봅니다.继续使用 4-1 的 60 行数据。表达方式不同,但表头和数值完全相同。在 Excel 中,数值显示在单元格里;在 CSV 中,同样的数值保存为用逗号分隔的文本行。本课将看看 pandas 怎样把这些文本行重新读成表格。
| 차시课时 | 파일文件 | 모양样子 |
|---|---|---|
| 4-1 | 04-library-data.xlsx | 칸으로 보이는 표按单元格显示的表格 |
| 4-2 | 04-library-data.csv | 쉼표로 나뉜 글자 줄用逗号分隔的文本行 |
두 파일은 머리글 세 개와 데이터 60줄이 완전히 같습니다.两个文件的三个表头和 60 行数据完全相同。
pandas를 프로젝트에 추가한다把 pandas 添加到项目中 실습实操
이번에는 오류를 일부러 만들지 않습니다. VS Code 터미널에서 uv add pandas를 직접 실행합니다. 그러면 uv가 pandas를 프로젝트의 라이브러리 목록에 기록하고, 현재 .venv에서도 사용할 수 있게 준비합니다. 그래서 명령 뒤에는 pyproject.toml과 Notebook 커널을 차례로 확인합니다.这次不用故意制造错误,直接在 VS Code 终端中运行 uv add pandas。uv 会把 pandas 记录到项目的库清单中,并让当前的 .venv 可以使用它。命令结束后,再依次检查 pyproject.toml 和 Notebook 内核。
uv add pandas
04폴더의 터미널에서 명령을 실행한다.在04文件夹的终端中运行命令。pyproject.toml에pandas줄이 생겼는지 확인한다.确认pyproject.toml中出现了pandas一行。- Notebook 화면으로 돌아가 커널을 다시 시작한다.回到 Notebook 画面,重新启动内核。
pandas는 도구, DataFrame은 표pandas 是工具,DataFrame 是表 핵심核心
pandas를 쓰면 아래 세 이름을 계속 보게 됩니다. 코드를 읽기 전에 각 이름이 무엇을 가리키는지부터 짚어 보겠습니다.使用 pandas 后,下面三个名称会反复出现。在读代码之前,先看看每个名称指的是什么。
| 이름名称 | 뜻含义 |
|---|---|
pandas | 표 데이터를 읽고 다루는 데 널리 쓰이는 라이브러리广泛用于读取和处理表格数据的库 |
DataFrame | pandas가 메모리에 만든 표pandas 在内存中创建的表 |
pd | 코드에서 pandas를 짧게 부르는 이름代码中 pandas 的简称 |
참고 · 누가, 왜 많이 쓸까?参考 · 谁在使用,为什么常用?
데이터 분석가와 연구자, Python 개발자가 많이 씁니다. CSV·Excel·데이터베이스의 표를 같은 DataFrame으로 읽고, 필요한 행과 열을 고르거나 평균을 계산하는 일을 한 도구에서 이어서 할 수 있기 때문입니다.数据分析师、研究人员和 Python 开发者经常使用它,因为 CSV、Excel 和数据库表都能读成同一种 DataFrame,并可在一个工具中继续筛选行列、计算平均值。
먼저 자료가 무엇을 말하는지 묻는다先询问这份数据表达什么 실습实操
notebooks/04-2_exercise.ipynb를 열고 AI에게 첫 번째 요청을 보냅니다.打开 notebooks/04-2_exercise.ipynb,向 AI 发送第一次请求。
data/04-library-data.csv를 읽어 줘. 이 파일이 어떤 자료인지 설명해 줘. 4-1에서 사용한 data/04-library-data.xlsx와 내용이 다른지도 확인해 줘. 아직 코드는 만들지 마.
请读取 data/04-library-data.csv。 请说明这是什么数据, 并确认它与 4-1 使用的 data/04-library-data.xlsx 在内容上是否不同。 暂时不要编写代码。
그래프를 바로 부탁하지 않습니다. AI의 첫 답을 읽고 자료의 뜻부터 확인합니다.不要马上要求画图。先阅读 AI 的第一次回答,确认数据的含义。
AI의 설명을 원본과 맞춰 본다把 AI 的说明与原始数据对照 실습实操
AI의 답이 도착하면 바로 다음 요청을 보내지 않습니다. CSV의 머리글과 줄 수를 직접 보며, 아래 네 가지가 설명과 맞는지 하나씩 확인합니다.收到 AI 的回答后,先不要发送下一条请求。请对照 CSV 的表头和行数,逐项确认下面四点是否一致。
| 확인할 것检查项目 | 원본에서 보이는 답原始数据中的答案 |
|---|---|
| 자료의 내용数据内容 | 날짜별 도서관 방문자 수와 대출한 책 수每天的图书馆访客人数和借出图书数量 |
| 머리글表头 | date · visitors · borrowed_books |
| 데이터 줄 수数据行数 | 60 |
| Excel과 차이与 Excel 的差别 | 표현 형식만 다르고 내용은 같음只有表现形式不同,内容相同 |
AI의 설명이 원본과 다르면 다음 요청으로 넘어가지 않습니다. AI에게 “원본과 다른 항목은 ○○이야. CSV를 다시 읽고 설명해 줘.”라고 알려 줍니다.如果 AI 的说明与原始数据不一致,先不要进入下一步。请把不一致的项目告诉 AI,让它重新读取 CSV 并说明。
두 평균을 AI에게 계산해 달라고 한다请 AI 计算两个平均值 실습实操
원본 자료를 이해했다면, 이제 같은 CSV에서 두 평균을 계산해 화면에 보여 달라고 요청합니다. AI가 작업할 파일까지 정확히 적어 줍니다.理解原始数据后,再请 AI 从同一个 CSV 中计算两个平均值,并显示在屏幕上。同时要准确写出 AI 需要修改的文件。
같은 CSV에서 다음 두 값을 계산해 줘. 1. 일별 방문자 수 visitors의 평균 2. 일별 대출한 책 수 borrowed_books의 평균 계산 결과를 notebooks/04-2_exercise.ipynb에 print()로 표시하는 셀도 만들어 줘.
请在同一个 CSV 中计算下面两个数值。 1. 每日访客人数 visitors 的平均值 2. 每日借出图书数量 borrowed_books 的平均值 请在 notebooks/04-2_exercise.ipynb 中 添加一个用 print() 显示结果的单元格。
두 평균을 계산한 셀을 실행한다运行计算两个平均值的单元格 실습实操
AI가 셀을 만들었다고 답하면 04-2_exercise.ipynb로 돌아옵니다. 새로 생긴 셀에서 두 열 이름을 먼저 찾고, 그다음 실행 버튼을 눌러 결과를 확인합니다.AI 回复已添加单元格后,回到 04-2_exercise.ipynb。先在新单元格中找到两个列名,再点击运行按钮查看结果。
visitors평균을 출력하는 줄이 있는지 본다.确认有一行输出visitors的平均值。borrowed_books평균을 출력하는 줄이 있는지 본다.确认有一行输出borrowed_books的平均值。- 셀을 실행해 두 결과가 코드 바로 아래에 나오는지 본다.运行单元格,确认两个结果显示在代码正下方。
추세선은 전체 흐름을 보기 쉽게 만든다趋势线让整体变化更容易看清 핵심核心
날짜별 값은 위아래로 흔들려 전체 흐름이 한눈에 보이지 않을 수 있습니다. 추세선에는 여러 방법이 있습니다. 이번 수업에서는 가까운 5개 평일의 평균을 이어 만든 선을 사용합니다. 이 선을 원자료 위에 겹치면 전체적으로 늘어나는지 줄어드는지 살펴보기 쉽습니다.每天的数值会上下波动,整体变化不一定一眼就能看清。趋势线有多种做法,本课使用相近 5 个工作日的平均值连成一条线。把它叠加在原始数据上,就更容易观察整体是在增加还是减少。
원자료原始数据
날짜마다 실제로 기록된 값每天实际记录的数值
5일 평균 추세선5 日平均趋势线
최근 5개 평일의 평균을 이어 만든 선连接最近 5 个工作日平均值形成的线
추세선은 내일 값을 맞히는 예측선이 아닙니다.趋势线不是预测明天数值的线。
그래프를 만들기 전에 축을 고른다画图前先选择坐标轴 실습实操
평균을 확인했으니 이제 그래프로 볼 순서입니다. 바로 그리게 하지 말고, 먼저 가로축과 세로축에 넣을 수 있는 열과 그것으로 알 수 있는 것을 묻습니다.确认平均值后,下一步才是用图表观察。不要立刻让 AI 画图,先询问横轴和纵轴可以使用哪些列,以及每种选择能看出什么。
이 데이터의 변화를 추세선으로 보고 싶어. x축과 y축에 어떤 열을 넣을 수 있는지 설명해 줘. 각 선택으로 무엇을 알 수 있는지도 말해 줘. 아직 그래프는 만들지 마.
我想用趋势线观察这份数据的变化。 请说明 x 轴和 y 轴可以放哪些列, 并说明每种选择能看出什么。 暂时不要画图。
AI의 추천을 그대로 따르기 전에, 우리가 보고 싶은 질문과 맞는지 먼저 고릅니다.不要直接照搬 AI 的推荐,要先判断它是否符合我们想了解的问题。
시간에 따른 방문자 수를 보기로 한다选择观察访客人数随时间的变化 핵심核心
이번에 답하고 싶은 질문은 “날짜가 지나면서 도서관 방문자 수가 어떻게 달라졌을까?”입니다. 시간의 순서를 x축에, 그때마다 달라지는 방문자 수를 y축에 놓습니다.这次要回答的问题是:“随着日期推移,图书馆访客人数怎样变化?”因此把时间顺序放在 x 轴,把每天变化的访客人数放在 y 轴。
| 자리位置 | 고른 열选择的列 | 뜻含义 |
|---|---|---|
| x축 | date | 시간의 순서时间顺序 |
| y축 | visitors | 날짜마다 달라지는 방문자 수每天变化的访客人数 |
borrowed_books를 y축에 고르면 대출 권수의 흐름을 볼 수 있습니다. 이번에는 4-1과 비교하기 위해 visitors를 고릅니다.如果把 borrowed_books 放在 y 轴,就能观察借书数量的变化。这次为了与 4-1 比较,我们选择 visitors。
고른 축으로 그래프를 만들어 달라고 한다请 AI 按选好的坐标轴制作图表 실습实操
보고 싶은 질문에 맞게 date와 visitors를 골랐습니다. 이제 원자료와 5일 평균 추세선이 한 그래프에 함께 보이도록 AI에게 제작을 맡깁니다.我们已经根据想要了解的问题,选择了 date 和 visitors。现在请 AI 制作图表,让原始数据和 5 日平均趋势线同时显示。
notebooks/04-2_exercise.ipynb에 그래프를 만들어 줘. x축은 date, y축은 visitors로 해 줘. 원자료는 회색 선으로 그리고, 5일 평균 추세선은 주황 #FF5C00으로 겹쳐 줘. 데이터 총 행 수, 열 이름, 두 평균도 print()로 표시해 줘. 원본 CSV와 다른 Notebook은 수정하지 마.
请在 notebooks/04-2_exercise.ipynb 中制作图表。 x 轴使用 date,y 轴使用 visitors。 原始数据用灰色线表示, 5 日平均趋势线用橙色 #FF5C00 叠加。 同时用 print() 显示总行数、列名和两个平均值。 不要修改原始 CSV 和其他 Notebook。
AI가 채운 셀을 읽고 직접 실행한다阅读并运行 AI 填写的单元格 실습实操
AI가 코드를 채워도 셀은 아직 실행되지 않았을 수 있습니다. Notebook으로 돌아가 파일 경로와 열 이름을 먼저 확인한 뒤, 셀을 위에서 아래로 직접 실행합니다.即使 AI 已填好代码,单元格也可能尚未运行。回到 Notebook,先确认文件路径和列名,再从上到下亲自运行。
- AI가 채운 셀에서 파일 경로와 열 이름을 찾는다.在 AI 填写的单元格中找到文件路径和列名。
- 셀을 위에서 아래로 실행한다.从上到下运行单元格。
- 오류가 나면 오류가 난 셀과 마지막 줄을 같은 대화에 보낸다.如果出错,把出错的单元格和最后一行错误信息发到同一个对话中。
결과가 원본과 맞는지 검토하게 한다请 AI 检查结果是否与原始数据一致 실습实操
방금 만든 Notebook 결과를 원본 CSV와 검토해 줘. - 데이터 60행, 열 3개가 맞는지 - 열 이름이 date, visitors, borrowed_books인지 - 두 평균이 원본 CSV를 다시 계산한 값과 같은지 - 그래프가 date와 visitors를 사용했는지 - 원자료와 5일 평균 추세선이 함께 보이는지 맞지 않는 항목이 있으면 코드도 고쳐 줘.
请把刚完成的 Notebook 结果与原始 CSV 对照检查。 - 是否为 60 行、3 列 - 列名是否为 date、visitors、borrowed_books - 两个平均值是否与重新计算原始 CSV 得到的结果一致 - 图表是否使用 date 和 visitors - 是否同时显示原始数据和 5 日平均趋势线 如有不一致,也请修改代码。
AI가 검토를 마쳤다고 바로 다음으로 넘어가지는 않습니다. AI가 고친 셀을 다시 실행하고, 출력된 수와 그래프가 원본 CSV에 맞는지 직접 확인합니다. 문제가 없으면 실습은 여기서 마칩니다.AI 完成检查后,不要马上进入下一步。重新运行 AI 修改过的单元格,并亲自确认输出的数值和图表是否与原始 CSV 一致。确认没有问题后,本次实践才算结束。
지금까지는 AI에게 일을 맡기고 결과를 검토했습니다. 다음에는 모두 같은 설명용 Notebook을 열어, 방금 한 일이 코드 안에서 어떤 순서와 블록으로 적혀 있는지 읽어 봅니다.到这里,我们把任务交给了 AI,并检查了结果。接下来打开全班共用的示例 Notebook,看看刚才完成的工作在代码中按什么顺序、分成哪些代码块。
설명용 Notebook을 열고 1번부터 읽는다打开示例 Notebook,从第 1 部分开始阅读 코드 읽기阅读代码
AI가 만든 실습용 Notebook은 요청을 받은 방식에 따라 코드 모양이 조금씩 다를 수 있습니다. 그래서 이제 모두 같은 notebooks/04-2_pandas_table.ipynb를 엽니다. 방금 실습한 일이 이 파일에서는 어떤 순서와 코드 블록으로 이어지는지 1번부터 함께 읽습니다.AI 生成的实操 Notebook 会因请求方式不同而略有差异。因此现在全班打开同一个 notebooks/04-2_pandas_table.ipynb。从第 1 部分开始,看看刚才完成的工作在代码里按什么顺序展开,各代码块分别做什么。
1번은 아직 코드를 실행하는 부분이 아닙니다. 뒤의 코드가 어느 파일을 읽는지, 그 파일의 첫 줄이 어떤 열 이름을 가지고 있는지 먼저 확인하는 안내입니다.第 1 部分还不是运行代码的部分。它先说明后面的代码要读取哪个文件,以及该文件第一行包含哪些列名。
파일: ../data/04-library-data.csv 첫 줄은 date,visitors,borrowed_books입니다. CSV는 한 줄이 데이터 한 행이고, 값 사이는 쉼표로 나뉩니다.
文件:../data/04-library-data.csv 第一行是 date,visitors,borrowed_books。 CSV 中每一行文字就是一行数据, 数值之间用逗号分隔。
Notebook은 notebooks 폴더 안에 있습니다. ../는 여기서 한 단계 위의 04 폴더로 올라간 뒤 data 폴더로 들어가라는 뜻입니다.Notebook 位于 notebooks 文件夹中。../ 表示先返回上一级 04 文件夹,再进入 data 文件夹。
첫 줄의 세 이름이 표의 열 이름이 됩니다.第一行的三个名称会成为表格的列名。
CSV에서는 쉼표가 Excel의 칸을 대신합니다.在 CSV 中,逗号代替 Excel 的单元格边界。
pandas를 한 번만 가져온다只导入一次 pandas 코드 읽기阅读代码
1번에서 원본 파일을 확인했으니, 이제 실제 코드가 시작됩니다. 첫 줄은 설치해 둔 pandas를 이 Notebook에서 부르는 준비입니다.第 1 部分确认了原始文件,现在开始阅读实际代码。第一行先把已经安装好的 pandas 导入当前 Notebook。
import pandas as pd설치해 둔 pandas를 이 Notebook에서 사용하겠다는 줄입니다.这一行表示在当前 Notebook 中使用已经安装的 pandas。
뒤에서는 긴 이름 대신 pd라고 짧게 부릅니다.后面的代码用较短的 pd 来称呼它。
이 줄은 2번에서 한 번만 실행합니다. 3번에서 다시 가져오지 않습니다.这一行只在第 2 部分运行一次,第 3 部分不再重复导入。
CSV를 읽어 표로 확인한다读取 CSV 并查看表格 코드 읽기阅读代码
도구를 불렀다면 다음은 원본 CSV를 읽을 차례입니다. 읽어 온 표에는 df라는 짧은 이름을 붙이고, 위쪽 다섯 행을 먼저 열어 제대로 읽혔는지 살펴봅니다.导入工具后,下一步是读取原始 CSV。把读入的表格简称为 df,再先查看最上面的五行,确认是否正确读入。
df = pd.read_csv("../data/04-library-data.csv") df.head()
괄호 안의 CSV 파일을 읽습니다.读取括号中指定的 CSV 文件。
읽어 온 표를 뒤에서 df라는 이름으로 사용합니다.把读入的表格命名为 df,供后面使用。
표의 위쪽 다섯 행을 보여 줍니다.显示表格最上面的五行。
표가 제대로 읽혔는지 확인하고 두 평균을 출력한다检查表格是否正确读入,并输出两个平均值 코드 읽기阅读代码
표를 읽은 뒤에는 크기와 열 이름부터 확인합니다. 원본과 맞다면 같은 표에서 두 평균을 계산해 화면에 출력합니다.读入表格后,先检查大小和列名。确认与原始数据一致,再用同一张表计算两个平均值并显示在屏幕上。
print("행과 열:", df.shape) print("열 이름:", list(df.columns)) print("첫 날짜:", df.loc[0, "date"]) print("방문자 평균:", round(df["visitors"].mean(), 2)) print("대출 권수 평균:", round(df["borrowed_books"].mean(), 2))
표의 크기, 열 이름, 첫 날짜를 원본과 맞춰 보는 블록입니다.这一块用来核对表格大小、列名和第一个日期。
두 열의 평균을 계산하고 소수 둘째 자리까지 보여 주는 블록입니다.这一块计算两列的平均值,并显示到小数点后两位。
계산한 내용을 코드 바로 아래에 글자로 보여 줍니다.把计算结果以文字显示在代码正下方。
열 이름을 축에 연결해 그래프를 그린다把列名连接到坐标轴并绘图 코드 읽기阅读代码
이제 date와 visitors를 각각 x축과 y축에 연결합니다. 날짜 60개를 모두 적으면 겹치므로 다섯 칸마다 한 번씩 보이게 줄입니다.现在把 date 和 visitors 分别连接到 x 轴和 y 轴。60 个日期全部显示会互相重叠,因此每隔五个位置显示一次。
ax = df.plot(x="date", y="visitors", kind="line", legend=False, color="#FF5C00", figsize=(10, 4.5)) ax.set_title("Library Visitors") ax.set_xlabel("Date") ax.set_ylabel("Visitors") positions = list(range(0, len(df), 5)) ax.set_xticks(positions) ax.set_xticklabels(df["date"].iloc[positions], rotation=45, ha="right")
고른 두 열을 x축과 y축에 연결합니다.把选好的两列连接到 x 轴和 y 轴。
그래프 제목과 두 축의 이름을 정합니다.设置图表标题和两个坐标轴名称。
날짜를 다 적지 않고 다섯 칸마다 기울여 표시합니다.日期不全部显示,而是每隔五格倾斜显示一次。
원자료 위에 5일 평균 추세선을 겹친다在原始数据上叠加 5 日平均趋势线 코드 읽기阅读代码
5번 그래프만으로는 하루하루의 흔들림이 먼저 보입니다. 6번에서는 5일 평균을 새 열에 만들고, 회색 원자료 위에 주황 추세선을 겹칩니다.第 5 部分的图表首先显示每天的波动。第 6 部分新建 5 日平均列,再把橙色趋势线叠加在灰色原始数据上。
df["visitor_trend"] = df["visitors"].rolling( window=5, min_periods=1).mean() ax = df.plot(x="date", y="visitors", color="#8B9098", figsize=(10, 4.5), label="Daily visitors") df.plot(x="date", y="visitor_trend", color="#FF5C00", linewidth=3, ax=ax, label="5-day average") ax.set_title("Library Visitors and Trend") ax.set_xlabel("Date") ax.set_ylabel("Visitors") positions = list(range(0, len(df), 5)) ax.set_xticks(positions) ax.set_xticklabels(df["date"].iloc[positions], rotation=45, ha="right")
최근 다섯 평일의 평균을 새 열에 만듭니다.把最近五个工作日的平均值存入新列。
실제 방문자 수를 회색 선으로 먼저 그립니다.先用灰色线画出实际访客人数。
같은 그래프 위에 주황 추세선을 겹칩니다.在同一张图上叠加橙色趋势线。
번호를 따라가면 코드의 흐름이 보인다按编号阅读,就能看见代码的流程
앞에서는 이 일을 AI에게 다섯 번 나누어 요청했고, 뒤에서는 같은 일이 코드의 1~6번 블록으로 이어지는 모습을 읽었습니다. 요청의 순서와 코드의 순서가 서로 연결된다는 점을 기억합니다.前半节课,我们把任务分成五次交给 AI;后半节课,我们又读了同一项工作怎样按 1~6 号代码块展开。请记住,请求的顺序和代码的顺序是相互对应的。
모든 문법을 외울 필요는 없습니다. 번호마다 화면에서 어떤 일이 일어나는지 읽을 수 있으면 됩니다.不需要记住所有语法。能读出每个编号在屏幕上完成什么工作就可以。