如何使用 Pandas 在 Python 中构建一个简单的数据分析工具
当你初次接触数据分析时,它可能会让你觉得显得很复杂。你可能会联想到庞大的数据库、高级的数学知识以及复杂的机器学习算法。 但实际上,许多有用的数据分析任务都是从一些非常简单的事情开始的:加载数据集、针对这些数据提出问题,然后使用Python来寻找答案。 在这个教程中,你将使用Python和pandas构建一个简单的数据分析工具。你会使用一个虚构的学生表现数据集,学习如何加载数据、查看数据内容、计算统计信息、过滤记录、对数据进行分组处理,以及创建基本的可视化图表。 完成这个教程后,你将会掌握一种可以用来分析各种类型CSV数据集的基础方法。 先决条件 在开始学习这个教程之前,你需要具备一些基础的Py
当你初次接触数据分析时,它可能会让你觉得显得很复杂。你可能会联想到庞大的数据库、高级的数学知识以及复杂的机器学习算法。
但实际上,许多有用的数据分析任务都是从一些非常简单的事情开始的:加载数据集、针对这些数据提出问题,然后使用Python来寻找答案。
在这个教程中,你将使用Python和pandas构建一个简单的数据分析工具。你会使用一个虚构的学生表现数据集,学习如何加载数据、查看数据内容、计算统计信息、过滤记录、对数据进行分组处理,以及创建基本的可视化图表。
完成这个教程后,你将会掌握一种可以用来分析各种类型CSV数据集的基础方法。
先决条件
在开始学习这个教程之前,你需要具备一些基础的Python技能和相应的工具。虽然不需要高级的编程能力或数据分析经验,但你应该熟悉以下内容:
- Python变量以及基本的数据类型,比如字符串和数字。
- 导入库以及调用函数。
- 如何使用列表以及对数据进行基本的操作。
如果你是Python新手,建议在继续学习之前先掌握这些基础知识。如果你想更深入地了解Python,这里有一个交互式Python学习课程可供参考。
另外,请确保你已经安装了以下软件:
- Python: Python 3或兼容的Python版本。
- pandas: 我们将使用这个库来加载、过滤、分组和分析数据。
- Matplotlib: 用于创建可视化图表的库。
- 代码编辑器或集成开发环境: 如VS Code、PyCharm,或者简单的文本编辑器,并且需要能够使用终端。
你可以在终端中运行以下命令来安装pandas和Matplotlib:
pip install pandas matplotlib
你还需要一个文件夹,用来保存你的Python脚本以及我们在本教程中会创建的students.csv数据集。
当所有准备工作都完成后,你就可以开始使用Python进行数据分析了!
我们将学习的内容:
- 设置开发环境
- 创建数据集
- 使用pandas加载数据集
- 探索数据内容
- 计算基本统计量
- 过滤数据
- 查找特定学生信息
- 对数据进行分组
- 分析学习时间
- 创建可视化图表
- 构建完整的数据分析工具
- 提高数据分析工具的复用性
- 处理缺失数据
- 导出分析结果
- 避免常见的错误
- 后续学习方向
- 总结与思考
设置你的开发环境
安装 pandas
如果你还没有安装 pandas,请打开终端并运行以下命令:
pip install pandas matplotlib
我们将使用 pandas 进行数据分析,而使用 Matplotlib 来进行简单的数据可视化。
你可以通过以下代码来验证是否已经成功安装了这些软件:
import pandas as pd
import matplotlib.pyplot as plt
print(pd.__version__)
如果 Python 显示出了版本号,那就说明你已经准备好了继续下一步。
创建数据集
创建 CSV 文件
我们首先会创建一个名为 students.csv 的文件,然后向其中添加一些数据。
这里使用的数据集是虚构的,其中包含了 12 名从九年级到十二年级的学生的信息。每一行代表一名学生,而每一列则描述了该学生的不同属性:
name:学生的名字。grade:学生当前所处的年级。study_hours:学生学习所花费的时间(以小时为单位)。attendance:学生的出勤率。score:学生的考试成绩,分数范围为 0 到 100 分。
例如,Ava 在九年级,学习了 4.5 小时,出勤率为 95%,考试得了 82 分。这些样本数据可以帮助我们探讨诸如“学习时间是否与考试成绩有关”以及“不同年级的平均分数有何差异”之类的问题。
由于这些数据是虚构的且数量较少,因此我们所观察到的任何规律都只具有参考意义,不应将其视为关于所有学生的普遍结论。
不过,这些数据仍然足以让我们进行一些有用的分析。以下是具体的数据内容:
name,grade,study_hours,attendance,score
Ava,9,4.5,95,82
Liam,9,6.0,98,91
Sophia,10,3.5,89,76
Noah,10,7.0,99,94
Emma,11,5.5,93,88
Oliver,11,8.0,97,96
Mia,12,4.0,91,79
Ethan,12,6.5,96,90
Isabella,9,7.5,100,97
Lucas,10,2.5,85,68
Amelia,11,6.0,94,92
James,12,5.0,90,84
使用 pandas 加载数据集
读取 CSV 文件
首先,通过导入 pandas 来启动你的 Python 程序:
import pandas as pd
然后加载 CSV 文件:
data = pd.read_csv("students.csv")
read_csv() 函数会读取 CSV 文件,并将其转换成 pandas 的 DataFrame 数据结构。
DataFrame 是一种类似表格的数据结构,包含行和列。你可以把它想象成一个可编程的电子表格。
让我们来查看一下这个数据集:
print(data)
你应该会看到终端中显示出来的学生信息。
分析数据
在分析数据集之前,了解自己正在处理的是什么内容是非常有用的。
查看前几行数据
head()方法可以显示前五行数据:
print(data.head())
你也可以指定要显示的行数:
print(data.head(3))
检查数据集的大小
使用shape属性可以获取数据集的行数和列数:
print(data.shape)
输出结果将会是:
(12, 5)
这意味着我们的数据集包含12行和5列。
查看列名
你可以使用以下代码来查看列名:
print(data.columns)
当你在程序中需要引用这些列名时,这个功能会非常有用。
检查数据类型
使用info()方法可以查看每列的数据类型:
data.info()
这样就能判断每一列包含的是整数、小数、文本还是其他类型的数据。
计算基本统计量
Pandas使得无需手动编写数学公式就能轻松计算各种统计量。
计算平均分
我们可以使用以下代码来计算平均分:
average_score = data["score"].mean()
print(f"平均分:{average_score:.2f}")
mean()方法用于计算算术平均值。
.2f这种格式化方式会让Python以两位小数的形式显示结果。
找出最高分和最低分
可以使用max()和min()方法来获取这些值:
highest_score = data["score"].max()
lowest_score = data["score"].min()
print(f>最高分:{highest_score})
print(f>最低分:{lowest_score})
你还可以计算中位数:
median_score = data["score"].median()
print(f>中位数:{median_score})
当所有分数按顺序排列后,中位数就是位于中间的那个数值。
生成统计摘要
Pandas还提供了一个方便的describe()方法:
print(data["score"].describe())
使用这个方法可以得到以下统计信息:
- 数据总量
- 平均值
- 标准差
- 最小值
- 第25百分位数
- 中位数
- 第75百分位数
- 最大值
你可以为所有数值列生成摘要:
print(data.describe())
在探索不熟悉的数据集时,这通常是你会首先使用的命令之一。
数据筛选
pandas最实用的功能之一就是能够根据条件来选择数据行。
查找高分学生
假设我们想找到得分至少为90分的学生:
high_scores = data[data["score"] >= 90]
print(high_scores)
这个表达式:
data["score"] >= 90
为每一行创建了一个布尔条件。pandas会保留那些满足该条件的行。
查找学习时间超过五小时的学生
我们也可以使用学习时间来执行相同的操作:
frequent_studiers = data[data["study_hours"] > 5]
print(frequent_studiers)
你还可以同时结合多个条件。
例如,如果我们想找到学习时间超过五小时且出勤率超过95%的学生:
students = data[
(data["study_hours"] > 5) & \
(data["attendance"] > 95)
]
print(students)
在pandas中组合条件时,使用&表示“与”,使用|表示“或”。每个条件都应放在括号内。
查找特定学生
使用idxmax()
有时候你不仅仅想要最高的数值,还想知道这个数值对应的是哪条记录。
例如:
top_student_index = data["score"].idxmax()
top_student = data.loc[top_student_index]
print(top_student)
idxmax()会返回包含最大数值的那行的索引。
对于学习时间来说,也可以这样做:
most_studious_index = data["study_hours"].idxmax()
most_studious_student = data.loc[most_studious_index]
print(most_studious_student)
这样就可以将统计结果与原始记录关联起来。
数据分组
当你的数据集包含分类信息时,分组功能就会变得非常有用。
在我们的数据集中,学生被分在不同的年级中。
按年级计算平均分数
我们可以计算每个年级的平均分数:
average_by_grade = data.groupby("grade")["score"].mean()
print(average_by_grade)
这样我们就能了解不同年级的平均分数有何差异。
我们还可以让输出结果更易于阅读:
average_by_grade = (
data.groupby("grade")["score"]
.mean()
.round(2)
)
print(average_by_grade)
多种统计分析
你可以一次性计算多种统计指标:
grade_summary = data.groupby("grade")["score"].agg(
["mean", "min", "max", "count"]
)
print(grade_summary)
这样就可以得到每个年级的平均分、最低分、最高分以及该年级的学生人数等信息。
分析学习时间
我们还可以研究学习时间与考试成绩之间的关系。
计算相关性
Pandas提供了一个corr()方法:
correlation = data["study_hours"].corr(data["score"])
print(f"相关性系数:{correlation:.2f}")
相关性的取值范围通常在-1到1之间。
数值越接近1,表示正线性关系越强;数值越接近-1,表示负线性关系越强;而数值接近0则说明两者之间几乎没有线性关系。
然而,相关性并不能证明一个变量必然导致另一个变量的变化。例如,如果这个数据集中的学习时间与考试成绩存在相关性,也不能因此就断定学习时间越长,考试成绩就会越高。
创建可视化图表
数字固然有用,但可视化图表能让人们更轻松地发现数据中的规律。
制作散点图
我们将制作一张显示学习时间与考试成绩之间关系的散点图:
import matplotlib.pyplot as plt
plt.scatter(data["study_hours"], data["score"])
plt.xlabel("学习时间")
plt.ylabel("考试成绩")
plt.title("学习时间与考试成绩的关系")
plt.show()
每个点代表一名学生。
x轴表示学习时间,y轴表示考试成绩。
你可能会发现,随着学习时间的增加,各点的分布趋势总体上是向上的。
实际效果应该如下图所示:
制作条形图
我们还可以绘制每个年级的平均分数对应的条形图:
average_by_grade = data.groupby("grade")["score"].mean()
average_by_grade.plot(kind="bar")
plt.xlabel("年级")
plt.ylabel("平均分数")
plt.title("各年级的平均分数")
plt.show()
条形图有助于直观地比较不同年级之间的平均分数差异。
最终的条形图效果应该如下图所示:

构建完整的分析工具
现在,让我们将这些主要的思路整合到一个程序中。
import pandas as pd
import matplotlib.pyplot as plt
# 加载数据集
data = pd.read_csv("students.csv")
# 基本信息展示
print("数据集的维度:")
print(data.shape)
print("\n前五行数据:")
print(data.head())
# 成绩统计
average_score = data["score"].mean()
median_score = data["score"].median()
highest_score = data["score"].max()
lowest_score = data["score"].min()
print("\n成绩统计结果")
print(f"平均分:{average_score:.2f}")
print(f"中位数:{median_score:.2f}")
print(f>最高分:{highest_score}")
print(f>最低分:{lowest_score}")
# 成绩在90分及以上的学生
high_scores = data[data["score"] >= 90]
print("\n成绩在90分及以上的学生信息:")
print(high_scores[["name", "score"]])
# 按年级划分的平均分数
average_by_grade = (
data.groupby("grade")["score"]
.mean()
.round(2)
)
print("\n按年级划分的平均分数:")
print(average_by_grade)
# 学习时间与成绩的相关性分析
correlation = data["study_hours"].corr(data["score"])
print(f"学习时间与成绩的相关性:{correlation:.2f}")
# 散点图展示
plt.scatter(data["study_hours"], data["score"])
plt.xlabel("学习时间")
plt.ylabel("考试成绩")
plt.title("学习时间与考试成绩的关系")
plt.show()
这个程序完成了一个简单但完整的数据分析流程。
让分析工具更具复用性
下一步就是将那些重复出现的操作转化为函数。
创建分析函数
我们不必把所有代码都直接写在主程序中,而是可以创建一些函数:
def analyze_scores(data):
average = data["score"].mean()
median = data["score"].median()
highest = data["score"].max()
lowest = data["score"].min()
print(f>平均分:{average:.2f}")
print(f>中位数:{median:.2f}")
print(f>最高分:{highest})
print(f>最低分:{lowest}
然后可以通过以下方式调用这个函数:
analyze_scores(data)
这样,代码就可以方便地用于其他数据集了。
为高分学生创建专用函数
我们还可以创建一个函数,用来提取那些成绩最高的学生信息:
def get_top_students(data, minimum_score=90):
return data[data["score"] >= minimum_score][
["name", "grade", "score"]
]
现在我们可以根据需要随时更改这个最低分数阈值:
print(get_top_students(data, 95))
当你的分析工具变得越来越复杂时,这样的函数就会显得尤为重要。
处理缺失数据
现实世界中的数据集很少像我们的示例那样干净。有时你可能会遇到缺失值。
你可以使用以下方法检查缺失值:
print(data.isnull().sum())
这个命令会告诉你每一列中存在多少个缺失值。
例如,你可以使用以下代码删除包含缺失值的行:
clean_data = data.dropna()
或者,根据数据集的具体情况以及缺失值的含义,你也可以选择替换这些缺失值:
data["score"] = data["score"].fillna(data["score"].mean())
不过,你不应该总是用平均值来替换所有的缺失值。合适的处理方法取决于缺失数据的实际含义以及你的分析目的。
导出结果
在分析完数据集之后,你可能想要保存分析结果。
例如:
average_by_grade.to_csv("average_scores_by_grade.csv")
你也可以保存过滤后的数据记录:
high_scores.to_csv("high_scoring_students.csv", index=False)
参数 `index=False` 可以防止 pandas 将数据框的索引列作为额外的一列添加到输出文件中。
需要避免的常见错误
忘记导入所需库
请确保已经导入了所有必要的库:
import pandas as pd
import matplotlib.pyplot as plt
否则,Python 将无法识别 `pd` 或 `plt` 这些模块的含义。
使用错误的列名
列名必须与你的数据集的实际名称一致。
例如,如果某列的名称是 `study_hours`,那么以下代码是无法正常运行的:
data["study time"]
你可以通过以下命令查看列名的实际内容:
print(data.columns)
将相关性误认为是因果关系
相关性可以揭示变量之间的关联,但它并不能证明其中一个变量是导致另一个变量变化的原因。
当你处理规模更大、结构更复杂的数据集时,这种区分就显得尤为重要了。
在理解数据之前先进行分析
人们往往会急于计算各种统计指标,但首先应该仔细查看数据本身。
一些有用的入门命令包括:
data.head()
data.shape
data.info()
data.describe()
data.isnull().sum()
了解数据的结构与质量有助于避免得出错误的分析结论。
下一步该怎么做
你构建的这个分析工具虽然设计得相对简单,但同样的工作流程完全可以应用于规模更大的数据集。
你可以将其扩展用于以下用途:
- 分析销售数据
- 追踪网站访问量
- 研究调查反馈结果
- 评估营销活动的效果
- 分析体育统计数据
- 探索金融数据集
- 跟踪应用程序或客户的相关信息
你还可以添加一些更高级的功能,比如交互式图表、命令行参数、自动生成的报告,或者机器学习模型。
例如,你可以让用户自行指定CSV文件的名称,而不用将文件名硬编码在程序中:
filename = input("请输入CSV文件的名称:")
data = pd.read_csv(filename)
print(data.head())
这样,同一个程序就可以用来分析不同的CSV文件了。
结语
开始处理数据时,你并不需要使用复杂的算法。只要使用Python、pandas以及规模适中的数据集,你就已经能够进行有意义的数据分析了。
通过本教程,你学会了以下内容:
- 如何使用pandas加载CSV文件
- 如何浏览DataFrame数据结构
- 如何计算统计数值
- 如何筛选数据行
- 如何查找特定记录
- 如何对数据进行分组处理
- 如何计算数据之间的相关性
- 如何制作数据可视化图表
- 如何处理缺失值
- 如何导出分析结果
- 如何利用函数来组织数据分析流程
接下来最重要的一步就是通过不同的数据集进行实践。一旦你熟练掌握了使用pandas加载、浏览、清洗和分析数据的方法,就可以开始着手开发更复杂的数据分析项目了。
祝编程愉快!
相关文章
高速决策流程:从零开始构建的Jev算法以及仅用于预填充数据的推理机制
自回归机制用于生成标记通常速度较慢,且耗费大量内存。尤其是当你只需要模型来进行结构化的分类或路由决策,而不是生成整段文本时,这种方法的局限性更为明显。 为了帮助工程师们克服这些限制,freeCodeCamp刚刚发布了 Jev课程:从零开始学习仅基于预填充数据的推理与决策模型 这一教学资源。 这份深入的PyTorch教程会指导你构建那些运行速度极快、以决策为核心功能的系统架构,这些系统能够完全在预填充数据阶段完成对输入数据的处理。 你将学到什么 仅基于预填充数据的架构 学习如何消除逐个标记解码的环节,从而让系统能够直接根据提示信息进行超低延迟的分类与操作。 编码器与解码器的设计 从零开始使用Py
阅读全文
学习真实的渗透测试技术:实践为主的道德黑客入门速成课程
了解恶意行为者是如何侵入网络的,这是构建具备抵御能力的网络基础设施的第一步。 为了帮助开发人员以及有志成为安全分析师的人们能够以合法且安全的方式学习攻击性安全技术的基础知识,我们刚刚在 freeCodeCamp.org 的YouTube频道上发布了 道德黑客究竟是如何入侵系统的 这一视频教程。 该教程由网络安全专家Declan Middleton主讲,时长为2.5小时。通过这个快速入门课程,你将学习终端操作、目标信息收集、漏洞评估、Web攻击技巧以及自动化脚本编写方法,所有这些内容都是在专门为教学设计的“夺旗赛”虚拟环境中进行的实践。 本教程涵盖的核心技能 Linux操作系统与终端操作 掌握在
阅读全文
如何利用知识图谱来检测金融欺诈行为:一份实用指南
在企业支付工作中,大多数反欺诈架构都是孤立地评估每笔交易的。 当一张发票到达系统时,自动规则引擎会依据静态阈值来检查它:确认金额是否在正常范围内,供应商是否在批准的供应商名单上,以及发送请求的IP地址是否可疑。如果这些单独的属性看起来都符合要求,支付流程就会继续进行。 但这种方法的本质缺陷在于其结构设计。像资金转移链条、循环开票机制或虚假供应商这类复杂的欺诈手段,很少会生成那些能触发单一阈值警报的交易。例如,一家空壳公司开具4,800美元的发票,从而低于5,000美元的双重审批门槛,单独来看这个交易似乎完全合法。但当25家看似独立的供应商都将资金汇入同一个银行账户时,这种协同作案的模式就会暴露
阅读全文
如何使用Python开发命令行天气应用
在完成了一些基础的Python项目之后,我开始对那些只是接收输入然后输出结果的程序感到有些厌倦了。我想做一些真正能够从互联网上获取数据的东西。 于是,我就制作了这个简单的天气应用。如果你觉得API还比较抽象,不用担心。只要记住,API其实就是让你的程序向另一个程序请求信息的一种方式而已。 这个应用的原理很简单:你在终端中输入一个城市名称,它就会显示该城市的当前温度和风速。虽然这个应用并不复杂,但它确实是一个帮助你熟悉API、HTTP请求以及命令行参数的好方法。 通过完成这个教程,你将学会如何发送HTTP请求、解析JSON数据、优雅地处理错误,以及如何编写可以在终端中使用的脚本。 我们将会涵盖的
阅读全文