Excel里要拉半小时的公式,Python里真的只要一行代码!
一、先看一个真实场景
王老师每天早上要干这些事:
以前她得:
- 在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个学生算好总分、平均分、排名、等级!")
三、分解"魔法":每行代码在干什么?
3.1 第1行:读取数据
成绩表 = pd.read_excel('学生成绩.xlsx')pd.read_excel():告诉Python"去读这个Excel文件"
- '学生成绩.xlsx':你的文件名字(改成你自己的)
试试看:把你的Excel文件放在同一个文件夹,改一下文件名就能用!
3.2 第2行:计算总分
成绩表['总分'] = 成绩表['语文'] + 成绩表['数学'] + 成绩表['英语']
分解理解:
- 成绩表['语文']:取出"语文"这一整列(50个分数)
- 成绩表['总分'] = :把算好的结果放到新列"总分"里
关键点:Python一次处理整列,不是一行行算的!
3.3 第3行:计算平均分
成绩表['平均分'] = (成绩表['总分'] / 3).round(2)
- 成绩表['平均分'] = :结果放到新列"平均分"
3.4 第4行:自动排名
成绩表['排名'] = 成绩表['总分'].rank(ascending=False).astype(int)
- 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 良好
看到了吗?
五、更多实用"变形术"
学会基础后,可以尝试这些:
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"- {评语}")
运行结果:
- 小明同学:学习态度端正,成绩良好。英语方面可以进一步提高。- 小红同学:学习态度端正,成绩良好。英语方面可以进一步提高。- 小刚同学:有进步空间,请继续努力。建议加强语文学习。- 小丽同学:本学期学习认真,成绩优秀。英语方面可以进一步提高。- 小华同学:学习态度端正,成绩良好。英语方面可以进一步提高。
七、重点总结:今天你学会了什么?
✅ 核心技能
- df['新列'] = df['列1'] + df['列2'] - 创建计算列
✅ 办公应用场景
✅ 效率对比
八、今日挑战:动手做!
# 复制这段代码,运行看看import pandas as pd我的数据 = pd.DataFrame({'商品': ['苹果', '香蕉', '橙子'],'单价': [5, 3, 4],'销量': [100, 150, 80]})# 你的任务:添加一列"销售额"(单价×销量)# 在这下面写你的代码:print(我的数据)
# 根据单价给商品分类# 单价≥4的是"高价",<4的是"平价"def 分类(单价):# 在这里写判断逻辑 pass # 删除这行,写你的代码我的数据['分类'] = 我的数据['单价'].apply(分类)print(我的数据)
# 计算总销售额、平均单价、最畅销商品总销售额 = 我的数据['销售额'].____() # 填空平均单价 = 我的数据['单价'].____() # 填空最畅销 = 我的数据['销量'].____() # 填空print(f"总销售额:{总销售额}元")print(f"平均单价:{平均单价:.1f}元")print(f"最畅销商品销量:{最畅销}件")
九、明日预告
明天学数据"连连看"!
回复"Py-Day"查看挑战题答案和完整代码。
- 特别提醒:今天的内容一定要动手运行代码!只看不练等于没学!
- 评论区作业:晒出你运行成功的截图,或者分享你的改进代码!👇