DataFrame案例

wen java案例 1

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

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就基本上手了!

抱歉,评论功能暂时关闭!