Day 48:【99天精通Python】数据分析 Pandas 入门 - Excel 的终结者
前言
欢迎来到第48天!
在昨天的课程中,我们学习了 NumPy。虽然 NumPy 计算很快,但它有个缺点:它没有标签。
比如一个二维数组,你很难直观地看出第 1 列是"姓名"还是"年龄"。
为了解决这个问题,基于 NumPy 构建的Pandas诞生了。它引入了两个核心数据结构:
- Series:带标签的一维数组(像 Excel 的一列)。
- DataFrame:带标签的二维表格(像整个 Excel 表)。
Pandas 是 Python 数据分析领域的绝对王者。掌握了它,你就可以轻松完成 Excel 能做的一切,以及 Excel 做不了的大数据处理。
本节内容:
- Pandas 安装
- Series 的创建与索引
- DataFrame 的创建与基本属性
- 读写文件 (read_csv, to_excel)
- 数据的查看与基础统计
- 实战练习:超市销售数据分析
一、安装与导入
pipinstallpandas openpyxl按照惯例,我们在代码中这样导入:
importpandasaspdimportnumpyasnp二、Series:带标签的数组
Series 就像是一个字典和数组的结合体。
2.1 创建 Series
# 1. 从列表创建 (默认索引 0, 1, 2...)s1=pd.Series([10,20,30])print(s1)# 0 10# 1 20# 2 30# dtype: int64# 2. 指定索引 (Index)s2=pd.Series([100,99,88],index=["Alice","Bob","Charlie"])print(s2)# Alice 100# Bob 99# Charlie 88# dtype: int64# 3. 从字典创建 (键自动变成索引)data={"Apple":5.0,"Banana":3.5,"Cherry":10.0}s3=pd.Series(data)print(s3)2.2 索引与切片
Series 既支持数字下标,也支持标签索引。
print(s2["Alice"])# 100 (标签索引)print(s2[0])# 100 (位置下标)print(s2["Alice":"Bob"])# 切片 (包含结尾!)# Alice 100# Bob 99三、DataFrame:表格数据
DataFrame 是 Pandas 的核心。它有行索引 (index) 和列索引 (columns)。
3.1 创建 DataFrame
# 1. 从字典列表创建 (最常用)data={"Name":["Tom","Jerry","Spike"],"Age":[10,8,12],"Score":[88,92,75]}df=pd.DataFrame(data)print(df)# Name Age Score# 0 Tom 10 88# 1 Jerry 8 92# 2 Spike 12 753.2 读写文件 (IO)
Pandas 最强大的地方在于一行代码读写各种格式。
# 写入 CSVdf.to_csv("students.csv",index=False)# index=False 不保存行号# 写入 Exceldf.to_excel("students.xlsx",index=False)# 读取 CSVdf_new=pd.read_csv("students.csv")四、查看数据
当数据量很大时(几万行),我们不可能直接 print 整个 df。
# 1. 查看前几行 / 后几行print(df.head(2))# 前2行print(df.tail(1))# 后1行# 2. 查看基本信息 (列名、非空数量、类型)print(df.info())# 3. 统计摘要 (平均值、最大值、四分位数)print(df.describe())五、数据的选取 (Selection)
Pandas 提供了多种取值方式,初学者容易晕,这里只讲最核心的。
5.1 取列 (Column)
# 取单列 (返回 Series)print(df["Name"])# 取多列 (返回新的 DataFrame)print(df[["Name","Score"]])5.2 loc vs iloc (行选取)
loc: 根据标签(Label) 取值。iloc: 根据整数位置(Integer) 取值。
# 设置 Name 为索引,方便演示df=df.set_index("Name")# Age Score# Name# Tom 10 88# Jerry 8 92# Spike 12 75# --- loc (标签) ---print(df.loc["Tom"])# 取 Tom 这一行print(df.loc["Tom","Score"])# 取 Tom 的 Score (88)# --- iloc (位置) ---print(df.iloc[0])# 取第0行 (Tom)print(df.iloc[0,1])# 取第0行第1列 (Score -> 88)六、实战练习:超市销售分析
假设我们有一份销售数据:
data={"Product":["Apple","Banana","Milk","Apple","Milk"],"Price":[5,3,10,5,10],"Quantity":[10,20,5,8,12],"Region":["North","South","North","South","South"]}df=pd.DataFrame(data)任务:
- 计算每笔订单的销售额 (Total = Price * Quantity)。
- 筛选出销售额大于 50 的订单。
- 按区域 (Region) 统计总销售额。
代码实现
# 1. 新增一列 Total# Pandas 支持列与列直接运算 (基于 NumPy 广播机制)df["Total"]=df["Price"]*df["Quantity"]print(df)# 2. 筛选 (Boolean Indexing)# 语法同 NumPy: df[条件]high_sales=df[df["Total"]>50]print("\n--- 大额订单 ---")print(high_sales)# 3. 分组统计 (Group By)# 类似于 SQL: SELECT Region, SUM(Total) FROM table GROUP BY Regionregion_sales=df.groupby("Region")["Total"].sum()print("\n--- 区域销售额 ---")print(region_sales)# Region# North 100# South 220# Name: Total, dtype: int64七、常见问题
Q1:loc和iloc怎么选?
- 如果你知道那一行的名字(Index),用
loc。 - 如果你只想遍历或者取前 10 行,用
iloc。
Q2:如何删除一行或一列?
使用drop方法。
df.drop("Age", axis=1): 删除列。df.drop("Tom", axis=0): 删除行。
注意:drop默认返回新对象,如果要在原对象修改,需加上inplace=True。
Q3:SettingWithCopyWarning 是什么?
当你尝试df[df["A"]>0]["B"] = 1时会报这个警告。Pandas 不确定你是要修改原数据还是副本。
建议:使用loc显式赋值:df.loc[df["A"]>0, "B"] = 1。
八、小结
关键要点:
- DataFrame是我们操作的主要对象。
- 列操作直接用
df['col'],行操作用loc/iloc。 - 列运算非常方便(
df['A'] + df['B'])。 groupby是分组统计的神器。
九、课后作业
- 成绩表生成:创建一个包含 5 名学生、3 门课(语数外)成绩的 DataFrame。
- 计算每个学生的总分,并新增一列
Total。 - 计算每门课的平均分。
- 计算每个学生的总分,并新增一列
- 筛选不及格:在上面的成绩表中,筛选出数学不及格 (<60) 的所有学生信息。
- 文件转换:手动创建一个 Excel 文件
data.xlsx,随便填点数据,写代码将其读取并转换为 CSV 文件。
下节预告
Day 49:Pandas 进阶 - 数据清洗与合并- 真实数据往往是脏乱差的(缺失值、重复值、格式错误)。明天我们学习如何给数据"洗澡",并将多张表拼接在一起。
系列导航:
- 上一篇:Day 47 - NumPy进阶
- 下一篇:Day 49 - Pandas进阶(待更新)