Python | 练习题<11>

27 阅读11分钟

题目 1:使用 Pandas 生成一个包含 10 行 3 列的 DataFrame

列名分别为 A、B、C,其中 A列数据为 1 到 10 的整数序列,B列数据为A列数据的平方,C 列数据为 A 列数据的立方,然后计算 B 列数据的总和。

import pandas as pd
df = pd.DataFrame({
    'A':range(1, 11),
    'B':[i**2 for i in range(1, 11)],
    'C':[i**3 for i in range(1, 11)]
})
b_sum = df['B'].sum()
print(df)
print(b_sum)

运行结果:

屏幕截图 2025-11-26 102935.png

题目 2:线上书店订单数据分析

“书店订单数据.csv” 包含字段:“订单 ID”“用户 ID”“图书类别”“购买数量”“图书定价 (元)”“折扣率 (0.7-1.0)”“支付时间”。

请使用 pandas 和 matplotlib 完成以下任务:

  1. 读取 CSV 文件数据,计算实际支付金额(图书定价 × 折扣率 × 购买数量),添加为新列。
  2. 按 “图书类别” 分组,统计各类别的订单数、总销量和总实际销售额。
  3. 提取 “支付时间” 中的小时信息(0-23),统计各时段的订单量,绘制折线图展示消费时段分布。
  4. 计算所有订单的实际支付金额的均值、中位数和标准差。
  5. 筛选出购买数量 ≥3 本的订单,保存为新 CSV 文件 “大额订单.csv”(不含索引)。

分解代码:

请使用 pandas 和 matplotlib 完成以下任务:

import matplotlib.pyplot as plt

1. 读取 CSV 文件数据,计算实际支付金额(图书定价 × 折扣率 × 购买数量),添加为新列。

data = pd.read_csv(
    "书店订单数据.csv",
    encoding='utf-8',
    index_col='订单ID'
)
print(data)
data['实际支付金额'] = data['图书定价 (元)'] * data['折扣率 (0.7-1.0)'] * data['购买数量']
print(data)

运行结果:

2111111111111111111.png

2. 按 “图书类别” 分组,统计各类别的订单数、总销量和总实际销售额。

book = data.groupby('图书类别').agg({
    '购买数量':'sum',
    '实际支付金额':'sum'
})
print(book)

运行结果:

22222222222.png

3. 提取 “支付时间” 中的小时信息(0-23),统计各时段的订单量,绘制折线图展示消费时段分布。

data['支付时间'] = pd.to_datetime(data['支付时间']) # 转换为datatime类型
data['小时数'] = data['支付时间'].dt.hour  # 小时
print(data)
hour_counts = data.groupby('小时数')['购买数量'].sum()
print(hour_counts)
plt.plot(hour_counts.index, hour_counts)
plt.show()

运行结果:

23333333333333333333.png

tttttttttttttttt.png

4. 计算所有订单的实际支付金额的均值、中位数和标准差。

states = data['实际支付金额'].agg(['mean', 'median', 'std'])
print(states)

运行结果:

24444444444444444448.png

5. 筛选出购买数量 ≥3 本的订单,保存为新 CSV 文件 “大额订单.csv”(不含索引)。

data = data.sort_values('购买数量', ascending=False)  # 降序排序
top3 = data[:3]
top3.to_csv('大额订单.csv')

运行结果:

2555555555.png

完整代码:

import matplotlib.pyplot as plt
# 1. 读取 CSV 文件数据,计算实际支付金额(图书定价 × 折扣率 × 购买数量),添加为新列。
data = pd.read_csv(
    "书店订单数据.csv",
    encoding='utf-8',
    index_col='订单ID'
)
print(data)
data['实际支付金额'] = data['图书定价 (元)'] * data['折扣率 (0.7-1.0)'] * data['购买数量']
print(data)

# 2. 按 “图书类别” 分组,统计各类别的订单数、总销量和总实际销售额。
book = data.groupby('图书类别').agg({
    '购买数量':'sum',
    '实际支付金额':'sum'
})
print(book)

# 3. 提取 “支付时间” 中的小时信息(0-23),统计各时段的订单量,绘制折线图展示消费时段分布。
data['支付时间'] = pd.to_datetime(data['支付时间']) # 转换为datatime类型
data['小时数'] = data['支付时间'].dt.hour  # 小时
print(data)
hour_counts = data.groupby('小时数')['购买数量'].sum()
print(hour_counts)
plt.plot(hour_counts.index, hour_counts)
plt.show()

# 4. 计算所有订单的实际支付金额的均值、中位数和标准差。
states = data['实际支付金额'].agg(['mean', 'median', 'std'])
print(states)

# 5. 筛选出购买数量 ≥3 本的订单,保存为新 CSV 文件 “大额订单.csv”(不含索引)。
data = data.sort_values('购买数量', ascending=False)  # 降序排序
top3 = data[:3]
top3.to_csv('大额订单.csv')

题目 3:学生考试成绩数据分析

“考试成绩数据.csv” 包含字段:“班级”“学号”“姓名”“语文”“数学”“英语”“理综 / 文综”“考试时间”。

请使用 pandas、numpy 和 matplotlib 完成以下任务:

  1. 读取 CSV 文件数据,计算每位学生的总分(四门科目之和)和平均分,添加为新列。
  2. 按 “班级” 分组,统计各科目的平均分、最高分和最低分(使用 agg 函数批量统计)。
  3. 筛选出总分 ≥600 分的学生,统计每个班级的高分人数,绘制柱状图。
  4. 计算数学成绩与理综 / 文综成绩的相关系数。
  5. 提取 “考试时间” 中的月份,统计不同月份的平均总分变化,绘制折线图。

分解代码:

1. 读取 CSV 文件数据,计算每位学生的总分(四门科目之和)和平均分,添加为新列。

df = pd.read_csv(
    "考试成绩数据.csv"
)
print(data)
subjects = ['语文','数学','英语','理综/文综,']
df['总分'] = df[subjects].sum(axis=1)
df['平均分'] = df[subjects].mean(axis=1)
print(df)

运行结果:

33111111111111111111.png

2. 按 “班级” 分组,统计各科目的平均分、最高分和最低分(使用 agg 函数批量统计)。

class_states = df.groupby('班级')[subjects].agg(['mean', 'median', 'std'])
print(class_states)

运行结果:

3222222222222222222.png

3. 筛选出总分 ≥600 分的学生,统计每个班级的高分人数,绘制柱状图。

plt.rcParams['font.sans-serif'] = ['SimHei']
high_score_student = df[df['总分'] >= 600]
print(high_score_student)
count = high_score_student['班级'].value_counts().sort_index()
print(count)
plt.bar(count.index, count)
plt.show()

运行结果:

333333333333333.png

ttttttttttttttttt.png

4. 计算数学成绩与理综 / 文综成绩的相关系数。

corr = df['数学'].corr(df['理综/文综'])
print(corr)

5. 提取 “考试时间” 中的月份,统计不同月份的平均总分变化,绘制折线图。

df['考试时间'] = pd.to_datetime(df['考试时间'])
df['月份'] = df['考试时间'].dt.month
mean_total = df.groupby('月份')['总分'].mean()
print(mean_total)
plt.plot(mean_total.index, mean_total)
plt.show()
print("555555555555555555555555555555")

运行结果:

35555555555555555.png

ttttttttttttttt.png

完整代码:

# 1. 读取 CSV 文件数据,计算每位学生的总分(四门科目之和)和平均分,添加为新列。
df = pd.read_csv(
    "考试成绩数据.csv"
)
print(data)
subjects = ['语文','数学','英语','理综/文综']
df['总分'] = df[subjects].sum(axis=1)
df['平均分'] = df[subjects].mean(axis=1)
print(df)

# 2. 按 “班级” 分组,统计各科目的平均分、最高分和最低分(使用 agg 函数批量统计)。
class_states = df.groupby('班级')[subjects].agg(['mean', 'median', 'std'])
print(class_states)

# 3. 筛选出总分 ≥600 分的学生,统计每个班级的高分人数,绘制柱状图。
plt.rcParams['font.sans-serif'] = ['SimHei']
high_score_student = df[df['总分'] >= 600]
print(high_score_student)
count = high_score_student['班级'].value_counts().sort_index()
print(count)
plt.bar(count.index, count)
plt.show()

# 4. 计算数学成绩与理综 / 文综成绩的相关系数。
corr = df['数学'].corr(df['理综/文综'])
print(corr)

# 5. 提取 “考试时间” 中的月份,统计不同月份的平均总分变化,绘制折线图。
df['考试时间'] = pd.to_datetime(df['考试时间'])
df['月份'] = df['考试时间'].dt.month
mean_total = df.groupby('月份')['总分'].mean()
print(mean_total)
plt.plot(mean_total.index, mean_total)
plt.show()

题目 4:教师教学评价数据分析

“教学评价数据.csv” 包含字段:“教师 ID”“学科”“授课班级”“学生评分 (1-5 分)”“评价人数”“评价日期”。

请使用 pandas 和 matplotlib 完成以下任务:

  1. 读取 CSV 文件数据,将 “评价日期” 转换为 datetime 格式。
  2. 计算每位教师的总评分(学生评分 × 评价人数)和平均评分,添加为新列。
  3. 按 “学科” 分组,统计各学科的平均评分和总评价人数。
  4. 提取 “评价日期” 中的星期信息,统计每周各天的评价数量,绘制柱状图。
  5. 找出平均评分最高的 3 位教师,用饼图展示他们的总评分占比。

分解代码:

1. 读取 CSV 文件数据,将 “评价日期” 转换为 datetime 格式。

data = pd.read_csv('教学评价数据.csv')
print(data)
data['评价日期'] = pd.to_datetime(data['评价日期'])

运行结果:

41111111.png

2. 计算每位教师的总评分(学生评分 × 评价人数)和平均评分,添加为新列。

data['总评分'] = data['学生评分 (1-5分)'] * data['评价人数']
mean_data = data.groupby('教师ID')['学生评分 (1-5分)'].mean()
print(data)
print(mean_data)

运行结果:

4222222.png

4222222222222222222222222222222222.png

3. 按 “学科” 分组,统计各学科的平均评分和总评价人数。

counts = data.groupby('学科').agg({
    '学生评分 (1-5分)':'mean',
    '评价人数':'mean'
})
print(count)

运行结果:

4333333.png

4. 提取 “评价日期” 中的星期信息,统计每周各天的评价数量,绘制柱状图。

data['星期'] = data['评价日期'].dt.weekday + 1
counts_weekday = data.groupby('星期')['评价人数'].sum()
plt.bar(counts_weekday.index, counts_weekday)
print(mean_data)
print(mean_data)

运行结果:

41.png

311111.png

50000.png

ttttttttttttt.png

5. 找出平均评分最高的 3 位教师,用饼图展示他们的总评分占比。

mean_data = mean_data.sort_values(ascending=False)
print(mean_data)
top3 = mean_data[:3]
total = mean_data.sum()
top3_rate = top3 / total
plt.pie(top3_rate, labels=top3_rate.index, autopct="%1.1f4%%")
plt.show()

运行结果:

511111111111png.png

522222.png

完整代码:

# 1. 读取 CSV 文件数据,将 “评价日期” 转换为 datetime 格式。
data = pd.read_csv('教学评价数据.csv')
print(data)
data['评价日期'] = pd.to_datetime(data['评价日期'])

# 2. 计算每位教师的总评分(学生评分 × 评价人数)和平均评分,添加为新列。
data['总评分'] = data['学生评分 (1-5分)'] * data['评价人数']
mean_data = data.groupby('教师ID')['学生评分 (1-5分)'].mean()
print(data)
print(mean_data)

# 3. 按 “学科” 分组,统计各学科的平均评分和总评价人数。
counts = data.groupby('学科').agg({
    '学生评分 (1-5分)':'mean',
    '评价人数':'mean'
})
print(count)

# 4. 提取 “评价日期” 中的星期信息,统计每周各天的评价数量,绘制柱状图。
data['星期'] = data['评价日期'].dt.weekday + 1
counts_weekday = data.groupby('星期')['评价人数'].sum()
plt.bar(counts_weekday.index, counts_weekday)
print(mean_data)
print(mean_data)

# 5. 找出平均评分最高的 3 位教师,用饼图展示他们的总评分占比。
mean_data = mean_data.sort_values(ascending=False)
print(mean_data)
top3 = mean_data[:3]
total = mean_data.sum()
top3_rate = top3 / total
plt.pie(top3_rate, labels=top3_rate.index, autopct="%1.1f4%%")
plt.show()