领导说表格太单调?Python三行代码让数据自动“亮”起来!
以前她用Excel:
一上午又没了!
import pandas as pd# 模拟费用数据df = pd.DataFrame({'部门': ['技术部', '市场部', '行政部', '财务部', '后勤部'],'预算': [10000, 8000, 5000, 6000, 4000],'实际': [9500, 9200, 4800, 6500, 3800],'完成率': [0.95, 1.15, 0.96, 1.08, 0.95]})# 魔法开始:给表格上色styled_df = df.style \ .applymap(lambda x: 'color: red'if x > 1 else'color: green', subset=['完成率']) \ .bar(subset=['预算', '实际'], color='#5fba7d') \ .background_gradient(subset=['完成率'], cmap='RdYlGn')# 保存到Excel(带格式!)styled_df.to_excel('费用报表_美化.xlsx', engine='openpyxl')print("✅ 搞定!表格已美颜,快去打开看看!")全部自动生成,数据更新了重新运行代码即可!
df.style.applymap(lambda x: 'color: red'if x > 1 else'color: green')注意:返回的是CSS样式字符串,比如'color: red'、'background-color: yellow'
.subset=['完成率'] # 只对'完成率'列应用可以在applymap、bar、background_gradient等方法后加subset参数,指定只处理某些列。
.bar(subset=['预算', '实际'], color='#5fba7d').background_gradient(subset=['完成率'], cmap='RdYlGn')styled_df.to_excel('文件名.xlsx', engine='openpyxl')必须指定 engine='openpyxl',否则样式不会保存!
import pandas as pd# 学生成绩表成绩表 = pd.DataFrame({'姓名': ['张三', '李四', '王五', '赵六', '钱七'],'班级': ['三(1)', '三(1)', '三(2)', '三(2)', '三(1)'],'语文': [85, 92, 78, 90, 88],'数学': [92, 88, 65, 95, 90], # 故意放一个不及格'英语': [88, 85, 80, 92, 87],'总分': [265, 265, 223, 277, 265]})print("📋 原始成绩表:")print(成绩表)# 定义标红函数def 标红不及格(分数):if 分数 < 60:return'background-color: red; color: white'return''styled = 成绩表.style.applymap(标红不及格, subset=['数学'])styledJupyter里直接运行会显示样式化的表格!
styled.to_excel('成绩表_美颜.xlsx', engine='openpyxl')print("✅ 已保存!")打开Excel看看,数学不及格的格子是不是红了?
import pandas as pd# 模拟各部门费用费用表 = pd.DataFrame({'部门': ['技术部', '市场部', '行政部', '财务部', '后勤部'],'预算': [10000, 8000, 5000, 6000, 4000],'实际': [9500, 9200, 4800, 6500, 3800],'负责人': ['张工', '李经理', '王主任', '赵总监', '刘主管']})# 计算差额和超支比例费用表['差额'] = 费用表['实际'] - 费用表['预算']费用表['超支比例'] = (费用表['差额'] / 费用表['预算']).round(2)def 超支颜色(val):if val > 0:return'background-color: #ffcccc'# 浅红背景elif val < 0:return'background-color: #ccffcc'# 浅绿背景return''def 比例颜色(val):if val > 0.1:return'color: red; font-weight: bold'elif val > 0:return'color: orange'else:return'color: green'# 应用样式styled = 费用表.style \ .applymap(超支颜色, subset=['差额']) \ .applymap(比例颜色, subset=['超支比例']) \ .bar(subset=['预算', '实际'], color='#5fba7d', vmin=0) \ .format({'预算': '¥{:,.0f}', '实际': '¥{:,.0f}', '差额': '¥{:+,.0f}', '超支比例': '{:.1%}'})# 保存styled.to_excel('费用超支预警.xlsx', engine='openpyxl')print("✅ 超支预警表已生成!")import pandas as pd# 学生成绩(包含各科和总分)学生表 = pd.DataFrame({'姓名': ['张三', '李四', '王五', '赵六', '钱七', '孙八'],'班级': ['三(1)', '三(1)', '三(2)', '三(2)', '三(1)', '三(2)'],'语文': [85, 92, 78, 90, 88, 95],'数学': [92, 88, 65, 95, 90, 82],'英语': [88, 85, 80, 92, 87, 90],'总分': [265, 265, 223, 277, 265, 267]})# 计算平均分和等级学生表['平均分'] = (学生表['总分'] / 3).round(1)def 等级(分):if 分 >= 90: return'A'elif 分 >= 80: return'B'elif 分 >= 60: return'C'else: return'D'学生表['等级'] = 学生表['平均分'].apply(等级)# 定义等级颜色等级颜色 = {'A': 'background-color: #92d050; color: black','B': 'background-color: #ffff00; color: black','C': 'background-color: #ffc000; color: black','D': 'background-color: #ff0000; color: white'}def 等级样式(val):return 等级颜色.get(val, '')# 定义分数段背景def 分数背景(score):if score >= 90:return'background-color: #c6efce'# 浅绿elif score >= 80:return'background-color: #ffeb9c'# 浅黄elif score >= 60:return'background-color: #ffc7ce'# 浅红else:return'background-color: #f2f2f2; color: red'# 灰底红字# 应用样式styled = 学生表.style \ .applymap(等级样式, subset=['等级']) \ .applymap(分数背景, subset=['语文', '数学', '英语']) \ .bar(subset=['总分', '平均分'], color='#5b9bd5', align='left') \ .format({'平均分': '{:.1f}', '总分': '{:.0f}'})# 设置列宽(可选,但to_excel不直接支持列宽,需用ExcelWriter高级设置)# 这里简单保存styled.to_excel('学生成绩_美颜.xlsx', engine='openpyxl')print("✅ 成绩表美颜完成!")def 高亮最大值(s): is_max = s == s.max()return ['background-color: yellow'if v else''for v in is_max]styled = df.style.apply(高亮最大值, subset=['语文', '数学', '英语'])虽然.style不能直接加标题,但可以在保存Excel后手动加,或者用ExcelWriter添加:
with pd.ExcelWriter('报表.xlsx', engine='openpyxl') as writer: styled.to_excel(writer, sheet_name='数据', index=False)# 可以在这里用openpyxl操作工作表,比如设置列宽、添加标题行等Pandas Styler原生不支持图标集,但可以用background_gradient模拟,或者用bar显示数据条。如果需要图标,可以结合openpyxl的条件格式,但较复杂。通常背景色和数据条已够用。
styled.format({'金额': '¥{:,.2f}', '比例': '{:.1%}'}).applymap(func) | .applymap(lambda x: 'color: red' if x>0 else '') | |
.apply(func, axis) | .apply(highlight_max, axis=0) | |
.bar() | .bar(subset=['列'], color='blue') | |
.background_gradient() | .background_gradient(cmap='Blues') | |
.text_gradient() | ||
.highlight_max() | .highlight_max(color='yellow') | |
.highlight_min() | .highlight_min(color='lightblue') | |
.highlight_null() | .highlight_null(color='gray') | |
.format() | .format({'列':'{:.2f}'}) | |
.set_table_styles() | .set_table_styles([{'selector': 'th', 'props': [('background', 'lightgray')]}]) |
# 用下面的数据df = pd.DataFrame({'姓名': ['张三', '李四', '王五'],'一季度': [85, 92, 78],'二季度': [88, 90, 82],'三季度': [90, 91, 85]})# 任务:给一季度、二季度、三季度加数据条,平均分用渐变色# 某项目支出表项目表 = pd.DataFrame({'项目': ['A项目', 'B项目', 'C项目', 'D项目'],'预算': [50000, 30000, 20000, 40000],'已支出': [48000, 32000, 19000, 45000]})# 任务:添加“剩余”列,剩余为负的标红背景,为正的标绿背景# 员工考勤考勤 = pd.DataFrame({'姓名': ['张工', '李工', '王工'],'出勤天数': [22, 20, 21],'迟到次数': [0, 3, 1],'请假天数': [0, 2, 1]})# 任务:迟到>2的标黄,请假>1的标蓝,出勤满勤的加粗明天学自动化办公终极武器:
真正的“无人驾驶”办公,从明天开始!
回复「Py-Day」获取今日挑战题解及全部代码。
评论区作业:晒出你美化后的Excel截图,比比谁的最漂亮!👇