我给你一个最经典的Pandas DataFrame案例——学生成绩分析。

这个案例涵盖了DataFrame的创建、筛选、排序、分组、聚合、数据清洗和可视化,非常实用。
📊 场景:学生考试成绩分析
假设你是班主任,拿到了一张包含学生信息的Excel表格,需要分析班级成绩。
1️⃣ 创建DataFrame
import pandas as pd
import numpy as np
# 方法一:用字典直接创建
data = {
'姓名': ['张三', '李四', '王五', '赵六', '孙七', '周八', '吴九', '郑十'],
'性别': ['男', '女', '男', '女', '男', '女', '男', '女'],
'班级': ['1班', '1班', '1班', '2班', '2班', '2班', '3班', '3班'],
'语文': [85, 92, 78, 90, 88, 76, 95, 82],
'数学': [90, 85, 88, 92, 79, 85, 91, 87],
'英语': [78, 95, 82, 88, 90, 84, 89, 80],
'平时分': [80, 88, 85, 90, 82, 86, 92, 78]
}
df = pd.DataFrame(data)
print("原始数据:")
print(df)
print("\n数据形状:", df.shape)
print("列名:", list(df.columns))
2️⃣ 数据处理
# ===== ① 数据清洗 =====
# 检查是否有缺失值
print("缺失值检查:")
print(df.isnull().sum())
# 去除重复行(如果有)
df = df.drop_duplicates()
# ===== ② 添加新列 =====
# 计算总分(权重:语文30% + 数学30% + 英语20% + 平时分20%)
df['总分'] = (df['语文'] * 0.3 + df['数学'] * 0.3 +
df['英语'] * 0.2 + df['平时分'] * 0.2)
# 根据总分打等级
df['等级'] = pd.cut(df['总分'],
bins=[0, 60, 75, 85, 100],
labels=['不及格', '及格', '良好', '优秀'])
# 计算平均分
df['平均分'] = df[['语文', '数学', '英语']].mean(axis=1)
print("\n添加新列后的数据:")
print(df[['姓名', '总分', '平均分', '等级']])
3️⃣ 数据筛选与排序
# ===== ① 基本筛选 =====
# 找出语文成绩大于85分的学生
high_chinese = df[df['语文'] > 85]
print("\n语文>85分的学生:")
print(high_chinese[['姓名', '语文']])
# ===== ② 多条件筛选 =====
# 找出女同学且数学大于85
female_math_high = df[(df['性别'] == '女') & (df['数学'] > 85)]
print("\n女生且数学>85:")
print(female_math_high[['姓名', '性别', '数学']])
# ===== ③ 排序 =====
# 按总分降序排列
df_sorted = df.sort_values('总分', ascending=False)
print("\n按总分排名:")
print(df_sorted[['姓名', '总分']].reset_index(drop=True))
# ===== ④ 选择特定列 =====
# 只取姓名和等级
name_grade = df[['姓名', '等级']]
print("\n姓名和等级:")
print(name_grade)
4️⃣ 分组与统计
# ===== ① 按班级分组求各科平均分 =====
class_group = df.groupby('班级')[['语文', '数学', '英语', '总分']].mean()
print("\n各班平均成绩:")
print(class_group.round(2))
# ===== ② 按性别统计人数 =====
gender_count = df.groupby('性别').size()
print("\n男女生人数:")
print(gender_count)
# ===== ③ 多列聚合统计 =====
stats = df.groupby('班级').agg({
'语文': ['mean', 'max', 'min'],
'数学': ['mean', 'max', 'min'],
'总分': ['mean', 'sum']
})
print("\n各班详细统计:")
print(stats.round(2))
# ===== ④ 透视表 =====
pivot = pd.pivot_table(df,
index='班级',
columns='性别',
values='总分',
aggfunc='mean')
print("\n透视表(各班男女平均总分):")
print(pivot.round(2))
5️⃣ 数据可视化
import matplotlib.pyplot as plt
# 设置中文字体(Windows)
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# ===== ① 柱状图:各班平均总分 =====
class_avg = df.groupby('班级')['总分'].mean()
plt.figure(figsize=(8, 5))
class_avg.plot(kind='bar', color=['skyblue', 'lightgreen', 'orange'])'各班平均总分对比')
plt.xlabel('班级')
plt.ylabel('平均总分')
plt.xticks(rotation=0)
plt.tight_layout()
plt.show()
# ===== ② 散点图:数学 vs 语文 =====
plt.figure(figsize=(8, 6))
plt.scatter(df['语文'], df['数学'], c='blue', alpha=0.6, s=100)
plt.xlabel('语文成绩')
plt.ylabel('数学成绩')'语文 vs 数学成绩分布')
# 添加平均线
plt.axhline(y=df['数学'].mean(), color='red', linestyle='--', label=f"数学平均{df['数学'].mean():.1f}")
plt.axvline(x=df['语文'].mean(), color='green', linestyle='--', label=f"语文平均{df['语文'].mean():.1f}")
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()
6️⃣ 高级操作
# ===== ① apply函数自定义处理 =====
def grade_point(score):
"""将分数转换为绩点(4分制)"""
if score >= 90: return 4.0
elif score >= 85: return 3.5
elif score >= 80: return 3.0
elif score >= 75: return 2.5
elif score >= 70: return 2.0
else: return 1.0
# 对语文列应用函数
df['语文绩点'] = df['语文'].apply(grade_point)
print("\n添加语文绩点后的数据:")
print(df[['姓名', '语文', '语文绩点']])
# ===== ② 条件赋值(使用numpy.where) =====
df['是否优秀'] = np.where(df['总分'] >= 85, '是', '否')
print("\n标记优秀学生:")
print(df[['姓名', '总分', '是否优秀']])
# ===== ③ 导出数据 =====
# 导出为CSV
# df.to_csv('成绩分析.csv', index=False, encoding='utf-8-sig')
7️⃣ 完整输出示例
print("\n===== 最终成绩单 =====")
print(df[['姓名', '性别', '班级', '语文', '数学', '英语', '总分', '平均分', '等级']])
print("\n===== 班级排名 =====")
print(df.sort_values('总分', ascending=False)[['姓名', '班级', '总分']].reset_index(drop=True))
🎯 这个案例带给你什么?
| 功能 | 代码示例 | 应用场景 |
|---|---|---|
| 创建DF | pd.DataFrame(dict) |
从数据源创建表格 |
| 筛选 | df[condition] |
查找特定条件数据 |
| 分组 | df.groupby() |
分类统计 |
| 聚合 | .agg() |
求最大/最小/平均值 |
| 透视表 | pd.pivot_table() |
Excel中的数据透视 |
| 添加计算列 | df['新列'] |
计算总分/率 |
| 排序 | .sort_values() |
排行榜 |
| 可视化 | .plot() |
数据图表化 |
| 自定义函数 | .apply() |
批量处理特殊逻辑 |
💡 扩展:如何读取真实Excel数据?
# 读取Excel
# df = pd.read_excel('学生成绩.xlsx', sheet_name='Sheet1')
# 读取CSV
# df = pd.read_csv('成绩.csv', encoding='utf-8-sig')
# 从数据库读取
# import sqlite3
# conn = sqlite3.connect('school.db')
# df = pd.read_sql("SELECT * FROM 学生表", conn)
这个案例覆盖了Pandas DataFrame的90%的日常操作,把上面的代码跑一遍,你对DataFrame就基本上手了!
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播