Pandas 数据读取与清洗

本章导言

Pandas是Python编程语言中一个功能强大、非常流行的开源数据分析和处理库。它名字源于“Panel Data”(面板数据),为处理结构化数据(如表格、时间序列等)提供了高效且便捷的工具。

您可以把它想象成Python中的“超级Excel”。它核心的数据结构是两种:Series(一维数据,类似于Excel中的一列)和DataFrame(二维表格,类似于整个Excel工作表)。通过Pandas,您可以轻松地从各种文件(如CSV、Excel、数据库)中读取数据,然后进行一系列操作,包括:

  • 数据清洗:处理缺失值、删除重复行。
  • 数据转换:对数据进行筛选、排序、合并、变形和分组。
  • 数据分析:执行统计汇总、计算均值、中位数等。
  • 数据可视化:可以轻松地集成Matplotlib等库进行简单的图表绘制。

简而言之,Pandas是数据科学家、分析师和任何需要处理数据的人的必备工具,它让在Python中操作和分析数据变得直观而高效。

6.0 相关库安装与环境配置

安装 pandas

pandas 可以通过 pip 命令轻松安装:

1
pip install pandas

为加速下载,推荐使用国内镜像:

1
pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple

安装 openpyxl

为了支持 Excel 文件读写,还需要安装 openpyxl:

1
pip install openpyxl

国内镜像下载:

1
pip install openpyxl -i https://pypi.tuna.tsinghua.edu.cn/simple

6.1 pandas 两种基本数据结构

6.1.1 Series(一维数据)

Series 就像是一个带标签的列表,可以存储任何数据类型。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
import pandas as pd

# 创建 Series - 就像一个有名字的列表
scores = pd.Series([85, 92, 78, 96, 88])
print("学生分数:")
print(scores)
print(f"\n数据类型: {type(scores)}")

# 带自定义索引的 Series
students = pd.Series([85, 92, 78], index=['张三', '李四', '王五'])
print("\n带姓名的分数:")
print(students)

运行结果:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
学生分数:
0    85
1    92
2    78
3    96
4    88
dtype: int64

数据类型: <class 'pandas.core.series.Series'>

带姓名的分数:
张三    85
李四    92
王五    78
dtype: int64

关键说明:

  • Series:pandas 中的一维数据结构,类似于带标签的数组
  • 默认索引:如果不指定索引,会自动生成 0 开始的整数索引
  • 自定义索引:可以通过 index 参数指定有意义的标签作为索引

6.1.2 DataFrame(二维数据)

DataFrame 就像 Excel 表格,有行和列的结构。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# 创建 DataFrame - 就像 Excel 表格
data = {
    '姓名': ['张三', '李四', '王五', '赵六'],
    '年龄': [25, 30, 35, 28],
    '城市': ['北京', '上海', '广州', '深圳'],
    '薪资': [15000, 18000, 20000, 16000]
}

df = pd.DataFrame(data)
print("员工信息表:")
print(df)
print(f"\n数据类型: {type(df)}")
print(f"\n数据形状: {df.shape}")  # (行数, 列数)

运行结果:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
员工信息表:
   姓名  年龄  城市     薪资
0  张三  25  北京  15000
1  李四  30  上海  18000
2  王五  35  广州  20000
3  赵六  28  深圳  16000

数据类型: <class 'pandas.core.frame.DataFrame'>

数据形状: (4, 4)

关键说明:

  • DataFrame:pandas 中的二维表格数据结构,类似于 Excel 工作表或 SQL 表
  • 字典创建:通过 Python 字典创建 DataFrame,键成为列名,值成为列数据
  • 自动索引:DataFrame 会自动为每行生成行索引(0, 1, 2, 3…)
  • 数据形状:使用 shape 属性获取表格的维度信息(行数, 列数)
  • 列式存储:数据按列组织,每列可以是不同的数据类型但同一列类型一致
【课堂练习】创建基本数据结构

任务: 创建两个 Series 和一个 DataFrame

要求:

  1. 创建一个包含5个商品价格的 Series,索引为商品名称
  2. 创建一个包含学生身高的 Series,索引为学号(S001, S002, S003)
  3. 创建一个包含图书信息的 DataFrame,包含书名、作者、价格、出版年份四列,至少4本书

示例输出:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
商品价格:
手机     2999
笔记本   5999
平板     1999
耳机      399
鼠标       89
dtype: int64

学生身高:
S001    175
S002    168
S003    182
dtype: int64

图书信息:
     书名     作者    价格  出版年份
0   Python入门  张三  59.9    2023
1  数据分析实战  李四  79.9    2022

6.2 数据读写操作

6.2.1 写入 CSV 和 Excel 文件

示例1:写入二维列表

二维列表的第 0 个元素为表头行,其他为数据行。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
data = [
    ['订单号', '产品', '数量', '单价', '日期'],
    ['ORD001', '手机', 2, 2999, '2024-01-15'],
    ['ORD002', '笔记本', 1, 5999, '2024-01-16'],
    ['ORD003', '耳机', 3, 399, '2024-01-17'],
    ['ORD004', '鼠标', 5, 89, '2024-01-18']
]

# 创建DataFrame
# 第一行作为列名,其余作为数据
df = pd.DataFrame(data[1:], columns=data[0])

# 写入CSV文件
df.to_csv('订单数据.csv', index=False, encoding='utf-8-sig')
print("CSV文件已生成:订单数据.csv")

# 写入Excel文件
df.to_excel('订单数据.xlsx', index=False, sheet_name='销售数据')
print("Excel文件已生成:订单数据.xlsx")

示例2:写入python字典

字典的所有键为表头,字典的值为每列数据。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
# 创建示例数据
sales_data = {
    '订单号': ['ORD001', 'ORD002', 'ORD003', 'ORD004'],
    '产品': ['手机', '笔记本', '耳机', '鼠标'],
    '数量': [2, 1, 3, 5],
    '单价': [2999, 5999, 399, 89],
    '日期': ['2024-01-15', '2024-01-16', '2024-01-17', '2024-01-18']
}

df_sales = pd.DataFrame(sales_data)

# 写入 CSV 文件
df_sales.to_csv('sales_data.csv', index=False, encoding='utf-8-sig')
print("已保存为 sales_data.csv")

# 写入 Excel 文件
df_sales.to_excel('sales_data.xlsx', index=False, sheet_name='销售数据')
print("已保存为 sales_data.xlsx")

6.2.2 从 CSV 和 Excel 读取数据

1
2
3
4
5
6
7
8
9
# 从 CSV 文件读取
df_from_csv = pd.read_csv('sales_data.csv')
print("从 CSV 读取的数据:")
print(df_from_csv.head())

# 从 Excel 文件读取
df_from_excel = pd.read_excel('sales_data.xlsx', sheet_name='销售数据')
print("\n从 Excel 读取的数据:")
print(df_from_excel.head())
【课堂练习】文件读写操作

任务: 完成数据的写入和读取操作

要求:

  1. 创建一个包含学生成绩的 DataFrame(学号、姓名、语文、数学、英语)。成绩数据如下:

    学号 姓名 语文 数学 英语

    S001 张三 85 90 88

    S002 李四 92 87 85

    S003 王五 78 95 92

    S004 赵六 88 82 79

  2. 将数据保存为 CSV 文件(使用 utf-8-sig 编码),文件名为:student_score.csv

  3. 将数据保存为 Excel 文件,文件名为:student_score.xlsx

  4. 分别从前面生成的 CSV 和 Excel 文件读取数据,并打印前 5 行数据。

6.3 数据查看操作

下面的代码创建了一个包含员工信息的 DataFrame,并演示了 pandas 中常用的数据查看方法,包括查看数据形状、前后几行数据、列名、数据类型、基本信息和数值统计信息,为后续的数据分析提供了基础的数据概览。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 创建示例数据
data = {
    '姓名': ['张三', '李四', '王五', '赵六', '钱七'],
    '部门': ['技术部', '市场部', '技术部', '人事部', '市场部'],
    '年龄': [25, 30, 35, 28, 32],
    '薪资': [15000, 18000, 20000, 16000, 17000],
    '入职年份': [2020, 2019, 2018, 2021, 2019]
}

df = pd.DataFrame(data)
print("原始数据:")
print(df)

# 基本查看方法
print(f"\n数据形状(行数, 列数): {df.shape}")

print(f"\n前3行数据:")
print(df.head(3))

print(f"\n后2行数据:")
print(df.tail(2))

print(f"\n列名: {list(df.columns)}")

print(f"\n数据类型:")
print(df.dtypes)

print(f"\n基本信息:")
print(df.info())

print(f"\n统计信息:")
print(df.describe())

6.3.1 查看完整数据

1
2
print("原始数据:")
print(df)

知识点说明:

  • 直接打印DataFrame会以表格形式显示数据
  • 自动处理列对齐和格式美化
  • 如果数据量很大,默认只显示前后几行

6.3.2 查看数据形状

1
print(f"\n数据形状(行数, 列数): {df.shape}")

知识点说明:

  • shape 属性返回一个元组 (行数, 列数)
  • 类似于NumPy数组的shape概念
  • 快速了解数据规模的重要属性

6.3.3 查看前几行数据

1
2
print(f"\n前3行数据:")
print(df.head(3))

知识点说明:

  • head(n) 方法显示前n行数据
  • 默认参数n=5,即不传参数时显示前5行
  • 常用于快速浏览数据开头部分

6.3.4 查看后几行数据

1
2
print(f"\n后2行数据:")
print(df.tail(2))

知识点说明:

  • tail(n) 方法显示后n行数据
  • 默认参数n=5
  • 用于检查数据末尾的内容

6.3.5 查看列名

1
print(f"\n列名: {list(df.columns)}")

知识点说明:

  • columns 属性返回所有列名的Index对象
  • 可以转换为列表方便查看和使用
  • 列名是数据框的重要标识

6.3.6 查看数据类型

1
2
print(f"\n数据类型:")
print(df.dtypes)

知识点说明:

  • dtypes 属性显示每列的数据类型
  • Pandas会自动推断数据类型:
    • 字符串 → object
    • 整数 → int64
    • 浮点数 → float64
  • 了解数据类型对后续数据处理很重要

6.3.7 查看基本信息

1
2
print(f"\n基本信息:")
print(df.info())

知识点说明:

  • info() 方法提供数据的综合信息:
    • 数据类型
    • 非空值数量
    • 内存使用情况
    • 数据形状
  • 是数据探索性分析的重要工具

6.3.8 查看数值统计信息

1
2
print(f"\n统计信息:")
print(df.describe())

知识点说明:

  • describe() 方法对数值列生成描述性统计:
    • 计数(count)
    • 均值(mean)
    • 标准差(std)
    • 最小值(min)
    • 四分位数(25%, 50%, 75%)
    • 最大值(max)
  • 只对数值型列有效,自动忽略非数值列
  • 快速了解数据分布情况
【课堂练习】数据查看与分析

任务: 对提供的数据集进行全面的查看和分析

数据:

1
2
3
4
5
6
7
8
product_data = {
    '产品ID': ['P001', 'P002', 'P003', 'P004', 'P005', 'P006'],
    '产品名称': ['手机', '笔记本', '平板', '耳机', '手表', '相机'],
    '类别': ['电子', '电子', '电子', '配件', '配件', '电子'],
    '库存数量': [50, 30, 45, 100, 80, 25],
    '单价': [2999, 5999, 1999, 399, 1299, 3599],
    '上架时间': ['2024-01-01', '2024-01-15', '2024-02-01', '2024-01-20', '2024-02-10', '2024-01-25']
}

要求:

  1. 创建 DataFrame 并查看基本形状和列名
  2. 使用 head() 和 tail() 查看数据
  3. 查看数据类型信息
  4. 使用 describe() 查看数值列的统计信息
  5. 回答以下问题:
    • 数据有多少行多少列?
    • 哪些列是数值型数据?
    • 单价的最大值和最小值是多少?
    • 平均库存数量是多少?

6.4 使用 loc 和 iloc 索引

6.4.1 loc - 按标签索引

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 按行标签和列名选择
print("选择前3行的姓名和薪资:")
print(df.loc[0:2, ['姓名', '薪资']])  # loc包含结束位置

# 按条件选择
print("\n选择技术部的员工:")
print(df.loc[df['部门'] == '技术部'])

# 选择特定行和列
print("\n选择第1、3、5行的姓名和部门:")
print(df.loc[[0, 2, 4], ['姓名', '部门']])

6.4.2 iloc - 按位置索引

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 按行号和列号选择(从0开始)
print("选择前2行,前3列:")
print(df.iloc[0:2, 0:3])  # iloc不包含结束位置

# 选择特定位置
print("\n选择第1行第2列的值:")
print(df.iloc[0, 1])

# 选择所有行的特定列
print("\n选择所有行的第1列和第3列:")
print(df.iloc[:, [0, 2]])
【课堂练习】loc 和 iloc 索引操作

任务: 使用 loc 和 iloc 对数据进行精确索引

数据: 使用之前创建的产品数据 DataFrame

要求:

  1. 使用 loc 选择:

    • 前3个产品的产品名称和单价
    • 所有电子类产品的完整信息
    • 产品ID为P002和P004的产品名称和库存
  2. 使用 iloc 选择:

    • 第2到第4行,第1到第3列
    • 第1行和第5行的所有列
    • 所有行的第0列和第4列
  3. 比较 loc 和 iloc 的区别:

    • 使用 loc[0:2] 和 iloc[0:2] 选择数据,观察差异
    • 解释为什么结果不同

思考: 什么情况下应该使用 loc,什么情况下使用 iloc?

6.5 行筛选和列筛选

6.5.1 列筛选

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 选择单列
names = df['姓名']
print("姓名列:")
print(names)

# 选择多列
subset = df[['姓名', '部门', '薪资']]
print("\n姓名、部门、薪资列:")
print(subset)

# 按数据类型选择列
numeric_cols = df.select_dtypes(include=['int64'])
print("\n数值型列:")
print(numeric_cols)

6.5.2 行筛选

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 按条件筛选行
print("薪资大于17000的员工:")
print(df[df['薪资'] > 17000])

print("\n技术部且年龄大于30的员工:")
print(df[(df['部门'] == '技术部') & (df['年龄'] > 30)])

print("\n市场部或人事部的员工:")
# print(df[(df['部门'] == '市场部') | (df['部门'] == '人事部')])
print(df[df['部门'].isin(['市场部', '人事部'])])

# 使用 query 方法(更简洁)
print("\n使用query筛选薪资大于16000的员工:")
# print(df[df['薪资'] > 16000])
print(df.query('薪资 > 16000'))

print("\n薪资大于16000且为市场部的员工:")
# print(df[(df['薪资'] > 16000) & (df['部门'] == '市场部')])
print(df.query('薪资 > 16000 & 部门 == "市场部"'))
print(df.query('薪资 > 16000 and 部门 == "市场部"'))

print("\n部门为人事部或市场部的员工:")
print(df.query('部门 == "人事部" | 部门 == "市场部"'))
print(df.query('部门 == "人事部" or 部门 == "市场部"'))
【课堂练习】数据筛选实战

任务: 对销售数据进行多条件筛选

数据:

1
2
3
4
5
6
7
sales = {
    '销售员': ['张三', '李四', '王五', '赵六', '张三', '李四', '王五'],
    '产品': ['手机', '笔记本', '平板', '手机', '耳机', '笔记本', '平板'],
    '销售额': [2999, 5999, 1999, 2999, 399, 5999, 1999],
    '月份': [1, 1, 1, 2, 2, 2, 2],
    '是否达标': [True, True, False, True, False, True, True]
}

要求:

  1. 列筛选:选择销售员、产品、销售额三列
  2. 单条件筛选:销售额大于2000的销售记录
  3. 多条件筛选:1月份且销售额达标的记录
  4. 使用 isin 筛选:产品为手机或平板的销售记录
  5. 使用 query 方法:筛选2月份且销售额大于1000的记录

扩展: 尝试使用 ~ 符号进行反向筛选(如筛选未达标的记录)

6.6 新建列

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
# 基于现有列计算新列
df['年薪'] = df['薪资'] * 12
df['工龄'] = 2024 - df['入职年份']

def salary_grade(salary):
    if salary>18000:
        return '高'
    elif salary>16000:
        return '中'
    else:
        return '低'
df['薪资等级'] = df['薪资'].apply(salary_grade)

print("添加新列后的数据:")
print(df)

# 使用条件判断创建列
df['是否资深'] = df['工龄'] > 3
print("\n添加是否资深列:")
print(df[['姓名', '工龄', '是否资深']])
【课堂练习】创建衍生列

任务: 为电商数据创建多个衍生列

数据: 使用之前的产品数据,添加销量列:

1
product_data['销量'] = [120, 85, 150, 300, 200, 75]

要求:

  1. 计算每个产品的总销售额(单价 × 销量)
  2. 根据单价创建价格等级列:
    • 高价:单价 > 3000
    • 中价:1000 <= 单价 <= 3000
    • 低价:单价 < 1000
  3. 根据销量创建畅销等级列:
    • 热销:销量 > 200
    • 一般:100 <= 销量 <= 200
    • 滞销:销量 < 100
  4. 计算库存周转率(销量 / 库存数量)
  5. 添加一列标识是否为电子类产品

输出: 显示包含所有新列的 DataFrame,并解释每个新列的业务意义

6.7 基本统计分析

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 描述性统计
print("数值列的基本统计:")
print(df[['年龄', '薪资', '工龄']].describe())

# 单列统计
print(f"\n薪资统计:")
print(f"平均薪资: {df['薪资'].mean():.2f}")
print(f"最高薪资: {df['薪资'].max()}")
print(f"最低薪资: {df['薪资'].min()}")
print(f"薪资中位数: {df['薪资'].median()}")

# 分组统计
print("\n各部门统计:")
dept_stats = df.groupby('部门').agg({
    '姓名': 'count',
    '年龄': 'mean',
    '薪资': ['mean', 'max', 'min']
})
print(dept_stats)

# 计数统计
print("\n各部门人数:")
print(df['部门'].value_counts())

print("\n薪资等级分布:")
print(df['薪资等级'].value_counts())
【课堂练习】数据统计分析

任务: 对销售数据进行全面的统计分析

数据: 使用包含销售记录的 DataFrame

要求:

  1. 基本统计:计算销售额的描述性统计(均值、最大、最小、标准差等)
  2. 按销售员分组统计:
    • 每个销售员的销售总额
    • 每个销售员的平均销售额
    • 每个销售员的销售次数
  3. 按产品分组统计:
    • 每个产品的总销售额
    • 每个产品的平均销售额
    • 最畅销的产品(按销售额)
  4. 按月份统计:
    • 每个月的总销售额
    • 每月的销售记录数量
  5. 交叉分析:使用 pd.crosstab() 分析销售员在不同月份的销售情况

输出要求: 每个统计结果都要有清晰的说明,解释数据的业务含义

6.8 综合示例:学生成绩管理

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# 创建学生成绩数据
students = {
    '学号': ['S001', 'S002', 'S003', 'S004', 'S005'],
    '姓名': ['张三', '李四', '王五', '赵六', '钱七'],
    '语文': [85, 92, 78, 88, 95],
    '数学': [90, 88, 85, 92, 96],
    '英语': [78, 85, 90, 82, 88],
    '班级': ['一班', '二班', '一班', '二班', '一班']
}

df_students = pd.DataFrame(students)
print("学生成绩原始数据:")
print(df_students)

# 1. 添加总分和平均分列
df_students['总分'] = df_students['语文'] + df_students['数学'] + df_students['英语']
df_students['平均分'] = df_students['总分'] / 3

# 2. 添加成绩等级
def get_grade(score):
    if score >= 90: return '优秀'
    elif score >= 80: return '良好'
    elif score >= 70: return '中等'
    else: return '待提高'

df_students['等级'] = df_students['平均分'].apply(get_grade)

print("\n处理后的学生成绩:")
print(df_students)

# 3. 统计分析
print("\n=== 统计分析 ===")
print(f"全班平均分: {df_students['平均分'].mean():.2f}")
print(f"最高分: {df_students['总分'].max()}")
print(f"最低分: {df_students['总分'].min()}")

# 按班级统计
class_stats = df_students.groupby('班级').agg({
    '学号': 'count',
    '总分': ['mean', 'max', 'min'],
    '平均分': 'mean'
})
print("\n各班成绩统计:")
print(class_stats)

# 4. 筛选优秀学生
top_students = df_students[df_students['等级'] == '优秀']
print("\n优秀学生名单:")
print(top_students[['姓名', '班级', '总分', '等级']])

# 5. 保存结果
df_students.to_csv('student_scores.csv', index=False, encoding='utf-8-sig')
df_students.to_excel('student_scores.xlsx', index=False)
print("\n数据已保存为 student_scores.csv 和 student_scores.xlsx")
【课堂练习】综合实战:电商销售分析

任务: 完成一个完整的电商销售数据分析项目

数据:

1
2
3
4
5
6
7
8
9
ecommerce_data = {
    '订单号': ['ORD001', 'ORD002', 'ORD003', 'ORD004', 'ORD005', 'ORD006', 'ORD007'],
    '客户ID': ['C001', 'C002', 'C001', 'C003', 'C002', 'C004', 'C003'],
    '产品': ['手机', '笔记本', '耳机', '手机', '平板', '笔记本', '手表'],
    '类别': ['电子', '电子', '配件', '电子', '电子', '电子', '配件'],
    '数量': [1, 1, 2, 1, 1, 1, 1],
    '单价': [2999, 5999, 399, 2999, 1999, 5999, 1299],
    '日期': ['2024-01-15', '2024-01-16', '2024-01-17', '2024-01-18', '2024-01-19', '2024-01-20', '2024-01-21']
}

要求:

  1. 数据准备:创建 DataFrame,添加总价列(单价 × 数量)
  2. 数据查看:查看数据基本信息,识别数值列和文本列
  3. 数据筛选
    • 电子类产品的所有订单
    • 总价大于3000的订单
    • 客户C001的所有购买记录
  4. 数据分析
    • 按客户统计购买总金额和订单数量
    • 按产品统计销售总量和总金额
    • 按类别统计平均单价和总销售额
  5. 数据导出:将分析结果保存为CSV和Excel文件
  6. 报告生成:输出关键业务指标:
    • 总销售额
    • 最畅销的产品
    • 消费最高的客户
    • 平均订单价值

交付物: 完整的代码、保存的数据文件、关键指标报告

本章总结

核心知识点

  1. 两种数据结构

    • Series:一维带标签数组
    • DataFrame:二维表格数据
  2. 文件读写

    • to_csv() / read_csv():CSV 文件操作
    • to_excel() / read_excel():Excel 文件操作
  3. 数据查看

    • head(), tail(), info(), describe()
    • shape, columns, dtypes
  4. 数据索引

    • loc:按标签索引
    • iloc:按位置索引
  5. 数据筛选

    • 列筛选:df[['列1', '列2']]
    • 行筛选:df[df['条件']]
  6. 数据操作

    • 新建列:直接赋值或使用 apply()
    • 统计分析:mean(), max(), min(), groupby()

实用技巧

  • 保存 CSV 时使用 encoding='utf-8-sig' 避免中文乱码
  • 使用 index=False 不保存行索引
  • 条件筛选时注意使用 &(与)、|(或)
  • groupby() 配合 agg() 进行分组统计

课后作业

  1. 基础题:创建一个包含10个学生的DataFrame,包含姓名、三科成绩,计算总分和平均分
  2. 文件操作:将数据保存为CSV和Excel文件,然后重新读取验证
  3. 数据筛选:找出平均分大于85分的学生,以及数学成绩最高的3名学生
  4. 统计分析:按性别(可添加该列)分组统计各科平均分

练习要求:每个练习都要使用本章学到的 loc/iloc、条件筛选、新建列等操作。

0%