当前位置:首页>python>Day11:数据"变形术"!让Python帮你秒算全班总分、平均分

Day11:数据"变形术"!让Python帮你秒算全班总分、平均分

  • 2026-08-22 09:42:55
Day11:数据"变形术"!让Python帮你秒算全班总分、平均分

Excel里要拉半小时的公式,Python里真的只要一行代码!

一、先看一个真实场景

王老师每天早上要干这些事:

  • 把昨天考试的分数输入Excel
  • 给每个学生算总分(语文+数学+英语)
  • 给每个学生算平均分(总分÷3)
  • 按总分排名次
  • 给分数划等级(优秀/良好/及格)
以前她得:
  1. 在E列写公式 =C2+D2+E2 ✓
  2. 在F列写公式 =E2/3 ✓
  3. 在G列写公式 =RANK(E2,2:50) ✓
  4. 在H列写公式 =IF(F2>=90,"优秀",IF(F2>=80,"良好","及格")) ✓
然后……把公式往下拉50行!!!

50个学生 × 4个公式 = 200次操作,一不小心还可能拉错!

二、Python的"魔法"

今天我就教你4行代码,完成上面所有工作:import pandas as pd# 1. 读取你的Excel文件(假设文件里有50个学生的3科成绩)成绩表 = pd.read_excel('学生成绩.xlsx')# 2. 魔法开始!这4行代码代替了200次操作成绩表['总分'] = 成绩表['语文'] + 成绩表['数学'] + 成绩表['英语']  # 自动算50个人的总分成绩表['平均分'] = (成绩表['总分'] / 3).round(2)  # 自动算平均分,保留2位小数成绩表['排名'] = 成绩表['总分'].rank(ascending=False).astype(int)  # 自动排名次成绩表['等级'] = 成绩表['平均分'].apply(lambda x: '优秀'if x>=90 else'良好'if x>=80 else'及格')  # 自动划等级# 3. 保存结果成绩表.to_excel('带分析的成绩表.xlsx', index=False)print("✅ 搞定!已经为50个学生算好总分、平均分、排名、等级!")
  • 看明白了吗?
  • 不用写公式
  • 不用往下拉
  • 不会拉错行
  • 50个学生和500个学生代码一样多!

三、分解"魔法":每行代码在干什么?

3.1 第1行:读取数据

成绩表 = pd.read_excel('学生成绩.xlsx')pd.read_excel():告诉Python"去读这个Excel文件"
  • '学生成绩.xlsx':你的文件名字(改成你自己的)
  • 成绩表:给读进来的数据起个名字,方便后面用

试试看:把你的Excel文件放在同一个文件夹,改一下文件名就能用!

3.2 第2行:计算总分

成绩表['总分'] = 成绩表['语文'] + 成绩表['数学'] + 成绩表['英语']
分解理解:
  • 成绩表['语文']:取出"语文"这一整列(50个分数)
  • 成绩表['数学']:取出"数学"这一整列
  • 成绩表['英语']:取出"英语"这一整列
  • +:Python会自动把3列对应的每一行相加
  • 成绩表['总分'] = :把算好的结果放到新列"总分"里

关键点:Python一次处理整列,不是一行行算的!

3.3 第3行:计算平均分

成绩表['平均分'] = (成绩表['总分'] / 3).round(2)
  • 成绩表['总分'] / 3:总分列每个数都÷3
  • .round(2):结果保留2位小数
  • 成绩表['平均分'] = :结果放到新列"平均分"

3.4 第4行:自动排名

成绩表['排名'] = 成绩表['总分'].rank(ascending=False).astype(int)
  • .rank():排名函数
  • ascending=False:降序排列(分数高的排前面)
  • .astype(int):转成整数(不要小数排名)

3.5 第5行:划等级

成绩表['等级'] = 成绩表['平均分'].apply(lambda x: '优秀'if x>=90 else'良好'if x>=80 else'及格')

这个有点复杂,我们拆开看:

# 先定义一个判断函数def 判断等级(分数):if 分数 >= 90:return'优秀'elif 分数 >= 80:return'良好'else:return'及格'# 然后应用到每一行成绩表['等级'] = 成绩表['平均分'].apply(判断等级)

apply() 是重点函数:

  • 它对每一行数据执行同一个操作
  • 比如这里有50个平均分,它就执行50次判断等级()
  • 每次传入一个分数,返回一个等级 简化写法(lambda表达式):
成绩表['等级'] = 成绩表['平均分'].apply(lambda x: '优秀'if x>=90 else'良好'if x>=80 else'及格')
  • lambda x: 表示"定义一个临时函数,参数叫x"
  • if x>=90 else '良好' if x>=80 else '及格':三目运算符的嵌套

四、自己动手试试!

4.1 第一步:先创建测试数据

不用找真实的Excel,我们先在代码里创建一个:

import pandas as pd# 创建一个有5个学生的小表格测试数据 = pd.DataFrame({'姓名': ['小明', '小红', '小刚', '小丽', '小华'],'语文': [85, 92, 78, 90, 88],'数学': [92, 88, 85, 95, 90],'英语': [88, 85, 80, 92, 87]})print("📋 我们的测试数据:")print(测试数据)

运行后你会看到:

   姓名  语文  数学  英语0  小明   85   92   881  小红   92   88   852  小刚   78   85   803  小丽   90   95   924  小华   88   90   87

4.2 第二步:复制魔法代码

# 把刚才的4行魔法代码复制过来测试数据['总分'] = 测试数据['语文'] + 测试数据['数学'] + 测试数据['英语']测试数据['平均分'] = (测试数据['总分'] / 3).round(2)测试数据['排名'] = 测试数据['总分'].rank(ascending=False).astype(int)测试数据['等级'] = 测试数据['平均分'].apply(lambda x: '优秀'if x>=90 else'良好'if x>=80 else'及格')print("\n🎯 处理后的数据:")print(测试数据)

运行结果:

   姓名  语文  数学  英语  总分  平均分  排名   等级0  小明   85   92   88  265  88.33    3   良好1  小红   92   88   85  265  88.33    3   良好2  小刚   78   85   80  243  81.00    5   良好3  小丽   90   95   92  277  92.33    1   优秀4  小华   88   90   87  265  88.33    3   良好

看到了吗?

  • 小丽总分277,排名第1,等级优秀 ✓
  • 小红、小明、小华同分265,并列第3 ✓
  • 小刚243分,排名第5 ✓
  • 只用4行代码,完成了所有计算!

五、更多实用"变形术"

学会基础后,可以尝试这些:

5.1 给成绩"划分数线"

# 找出需要关注的学生(有科目不及格)需要关注 = 测试数据[(测试数据['语文'] < 60) |                    (测试数据['数学'] < 60) |                    (测试数据['英语'] < 60)]print("⚠️ 需要关注的学生:")print(需要关注[['姓名', '语文', '数学', '英语']])

5.2 计算班级平均分

# 计算全班的各科平均分print("\n📊 班级各科平均分:")print(f"语文:{测试数据['语文'].mean():.1f}分")print(f"数学:{测试数据['数学'].mean():.1f}分")print(f"英语:{测试数据['英语'].mean():.1f}分")print(f"总分:{测试数据['总分'].mean():.1f}分")

5.3 找出偏科学生

# 找出最高分和最低分差距大的学生def 判断偏科(行):    分数 = [行['语文'], 行['数学'], 行['英语']]return max(分数) - min(分数)  # 返回分差测试数据['分差'] = 测试数据.apply(判断偏科, axis=1)偏科学生 = 测试数据[测试数据['分差'] > 20]print("\n🎯 偏科学生(最高分最低分相差20分以上):")print(偏科学生[['姓名', '语文', '数学', '英语', '分差']])

六、办公实战:批量处理学生评语

李老师每个月要写学生评语,我们可以用Python生成模板:

# 根据成绩自动生成评语模板def 生成评语(行):    评语 = f"{行['姓名']}同学:"if 行['等级'] == '优秀':        评语 += "本学期学习认真,成绩优秀。"elif 行['等级'] == '良好':        评语 += "学习态度端正,成绩良好。"else:        评语 += "有进步空间,请继续努力。"# 添加具体科目建议if 行['语文'] < 行['数学'] and 行['语文'] < 行['英语']:        评语 += "建议加强语文学习。"elif 行['数学'] < 行['语文'] and 行['数学'] < 行['英语']:        评语 += "建议加强数学练习。"else:        评语 += "英语方面可以进一步提高。"return 评语测试数据['评语'] = 测试数据.apply(生成评语, axis=1)print("\n📝 自动生成的评语:")for 评语 in 测试数据['评语']:print(f"- {评语}")

运行结果:

- 小明同学:学习态度端正,成绩良好。英语方面可以进一步提高。- 小红同学:学习态度端正,成绩良好。英语方面可以进一步提高。- 小刚同学:有进步空间,请继续努力。建议加强语文学习。- 小丽同学:本学期学习认真,成绩优秀。英语方面可以进一步提高。- 小华同学:学习态度端正,成绩良好。英语方面可以进一步提高。

七、重点总结:今天你学会了什么?

✅ 核心技能

  1. df['新列'] = df['列1'] + df['列2'] - 创建计算列
  2. .apply(函数) - 对每一行应用函数
  3. .rank() - 自动排名
  4. .mean() - 计算平均值

✅ 办公应用场景

  1. 学生成绩统计:总分、平均分、排名、等级
  2. 成绩分析:找出不及格、偏科学生
  3. 评语生成:根据成绩自动生成评语模板
  4. 班级分析:计算各科平均分、优秀率

✅ 效率对比

  1. 任务 Excel操作 Python代码
  2. 50人算总分 写公式+下拉50次 1行代码
  3. 50人算平均分 写公式+下拉50次 1行代码
  4. 50人排名次 写公式+下拉50次 1行代码
  5. 50人划等级 写公式+下拉50次 1行代码
  6. 总计 200次操作 4行代码

八、今日挑战:动手做!

  • 任务1:创建你的第一个计算列
# 复制这段代码,运行看看import pandas as pd我的数据 = pd.DataFrame({'商品': ['苹果', '香蕉', '橙子'],'单价': [5, 3, 4],'销量': [100, 150, 80]})# 你的任务:添加一列"销售额"(单价×销量)# 在这下面写你的代码:print(我的数据)
  • 任务2:尝试用apply函数
# 根据单价给商品分类# 单价≥4的是"高价",<4的是"平价"def 分类(单价):# 在这里写判断逻辑    pass  # 删除这行,写你的代码我的数据['分类'] = 我的数据['单价'].apply(分类)print(我的数据)
  • 任务3(进阶):自动生成销售报告
# 计算总销售额、平均单价、最畅销商品总销售额 = 我的数据['销售额'].____()  # 填空平均单价 = 我的数据['单价'].____()    # 填空最畅销 = 我的数据['销量'].____()      # 填空print(f"总销售额:{总销售额}元")print(f"平均单价:{平均单价:.1f}元")print(f"最畅销商品销量:{最畅销}件")

九、明日预告

明天学数据"连连看"!

  • 如何把12个月的月考成绩合并成一张年表?
  • 如何把学生信息表和成绩表合并?
  • 如何把多个班级的数据汇总?
  • 不用复制粘贴,Python一键合并!

回复"Py-Day"查看挑战题答案和完整代码。

  • 特别提醒:今天的内容一定要动手运行代码!只看不练等于没学!
  • 评论区作业:晒出你运行成功的截图,或者分享你的改进代码!👇

最新文章

随机文章