首页/新闻资讯/正文详情

Pandas vs Excel vs SQL:同一个需求,三种写法

发布时间:2026/11/5 3:52:28 来源:云帆数科 栏目:资讯中心
Pandas vs Excel vs SQL:同一个需求,三种写法
写在前面同一个需求工具选错会浪费很多时间几百行数据做一次临时统计用 Pandas 写脚本可能比 Excel 拖两下还慢三千万行数据在 Excel 里筛卡到怀疑人生而这正是 SQL 的主场老板要「能自己改数」的表你交个脚本他只能干瞪眼。这篇不谈主义只做对照同一个需求三种工具分别怎么写、代价是什么。看完你应该能在一分钟内判断「这活该用哪个」。先确认示例数据在手边importosimportmkdataifnotos.path.exists(data/sales.csv):mkdata.main()print(示例数据就绪,os.path.exists(data/sales.csv))这段会检查第 1 篇生成的data/目录在不在不在就自动补一次已经有数据时只会打印一行示例数据就绪 True不影响后面的结果。需求定义按城市统计销售额并取 Top3需求写清楚才好对比把销售明细按城市汇总算出订单数和销售额按销售额降序取前 3 名。图 1三条判断线——数据量越大越往 SQL 靠要清洗复用选 Pandas要协作交付选 Excel。写法一Pandasimportpandasaspd dfpd.read_csv(data/sales.csv,encodingutf-8-sig)df[金额]df[金额].fillna((df[数量]*df[单价]).round(2))top3(df.groupby(城市,dropnaFalse).agg(订单数(金额,size),销售额(金额,sum)).round(2).sort_values(销售额,ascendingFalse).head(3))print(top3.to_string())订单数 销售额 城市 杭州 5 2805.1 上海 4 1545.0 北京 3 1425.9优点清洗、计算、导出一条龙中间结果随时看缺点要写代码别人改不了。写法二SQL用 SQLite 把数据塞进库里用一条 SQL 完成同样的聚合。importsqlite3importpandasaspd dfpd.read_csv(data/sales.csv,encodingutf-8-sig)df[金额]df[金额].fillna((df[数量]*df[单价]).round(2))connsqlite3.connect(data/demo.db)df.to_sql(sales,conn,if_existsreplace,indexFalse)sql SELECT 城市, COUNT(*) AS 订单数, ROUND(SUM(金额), 2) AS 销售额 FROM sales GROUP BY 城市 ORDER BY 销售额 DESC LIMIT 3 print(pd.read_sql(sql,conn).to_string(indexFalse))conn.close()城市 订单数 销售额 杭州 5 2805.1 上海 4 1545.0 北京 3 1425.9优点数据在库里几千万行也不用全读进内存聚合在数据库端完成比「读出来再 groupby」快得多缺点改需求要改 SQL清洗逻辑写起来比 Pandas 啰嗦。写法三ExcelExcel 的做法是数据透视表行城市值订单数计数、销售额求和再按销售额降序、取前 3。用代码模拟这个结果openpyxl 没法真的「拖透视表」但可以把结果按透视表的样子写出来importosimportpandasaspdfromopenpyxlimportWorkbookfromopenpyxl.stylesimportFont,PatternFill dfpd.read_csv(data/sales.csv,encodingutf-8-sig)df[金额]df[金额].fillna((df[数量]*df[单价]).round(2))pivot(df.groupby(城市,dropnaFalse).agg({金额:[size,sum]}).sort_values((金额,sum),ascendingFalse).head(3))pivot.columns[订单数,销售额]os.makedirs(output,exist_okTrue)wbWorkbook()wswb.active ws.title城市Top3ws.append([城市,订单数,销售额])forcity,rowinpivot.iterrows():ws.append([(缺失ifpd.isna(city)elsecity),int(row[订单数]),round(row[销售额],2)])forcellinws[1]:cell.fillPatternFill(solid,fgColor1D4ED8)cell.fontFont(colorFFFFFF,boldTrue)wb.save(output/城市Top3.xlsx)print(已导出 output/城市Top3.xlsx)print(pivot.round(2).to_string())已导出 output/城市Top3.xlsx 订单数 销售额 城市 杭州 5 2805.1 上海 4 1545.0 北京 3 1425.9优点所见即所得改一个数图表就动交付和协作最方便缺点数据量大就卡重复劳动多口径靠人记住。三栏对照维度PandasSQLExcel上手成本中要会 Python中要会 SELECT低适合数据量几十万 ~ 几百万行千万行以上十万行以内清洗能力强字符串、日期、缺失一把梭中CASE WHEN、正则因库而异弱靠公式和手工可复用强脚本一键重跑强存成视图/查询弱模板 手工刷新协作与交付弱别人要会跑脚本中要有库权限强人人能开口径可追溯强代码就是文档强弱藏在公式里图表能力中matplotlib/seaborn无强原生图表一句话选择数据在库里、量大 → SQL要清洗要复用 → Pandas要给人看、给人改 → Excel。三条衔接路径真实工作里很少只用一种工具更多是接力。三条最常用的路径① Pandas → SQL把 DataFrame 塞进库importsqlite3importpandasaspd dfpd.read_csv(data/sales.csv,encodingutf-8-sig).head(5)connsqlite3.connect(data/demo.db)df.to_sql(sales_tmp,conn,if_existsreplace,indexFalse)print(写库成功行数,pd.read_sql(SELECT COUNT(*) AS n FROM sales_tmp,conn)[n].iloc[0])conn.close()写库成功行数 5② SQL → Pandas把查询结果拉回来继续算importsqlite3importpandasaspd connsqlite3.connect(data/demo.db)sqlSELECT 城市, SUM(金额) AS 销售额 FROM sales GROUP BY 城市 ORDER BY 销售额 DESCresultpd.read_sql(sql,conn)conn.close()result[占比(%)](result[销售额]/result[销售额].sum()*100).round(1)print(result.to_string(indexFalse))城市 销售额 占比(%) 杭州 2805.1 42.2 上海 1545.0 23.3 北京 1425.9 21.5 广州 714.8 10.8 NaN 149.7 2.3③ Pandas → Excel算完交给 Excel 呈现importosimportpandasaspd dfpd.read_csv(data/sales.csv,encodingutf-8-sig)df[金额]df[金额].fillna((df[数量]*df[单价]).round(2))outdf.groupby(城市,dropnaFalse)[金额].sum().round(2).reset_index()os.makedirs(output,exist_okTrue)withpd.ExcelWriter(output/交接给Excel.xlsx,engineopenpyxl)aswriter:out.to_excel(writer,sheet_name按城市,indexFalse)print(已导出sheet 数,len(pd.read_excel(output/交接给Excel.xlsx,sheet_nameNone)))已导出sheet 数 1什么时候该换工具该从 Excel 换到 Pandas 的信号同一套汇总每周重做要合并 3 个以上文件数据超过 10 万行清洗规则复杂到要用嵌套 IF 写。该从 Pandas 换到 SQL 的信号数据量让read_csv超过 30 秒只需要汇总结果不需要明细数据每天都在更新你不想每次全量读。该从代码换回 Excel 的信号交付对象要自己改数要图表联动要走审批签字流程。常见问题Q1Pandas 里怎么执行 SQL小数据用sqlite3标准库零依赖to_sql写进去、read_sql查出来。真项目里用sqlalchemy.create_engine(mysqlpymysql://...)连生产库再pd.read_sql(sql, engine, params{...})。Q2SQL 的GROUP BY和groupby是一回事吗思路完全一样先分组、再对每组聚合。区别是 SQL 在数据库端算大数据量优势Pandas 在内存里算灵活、好调试。会一个另一个半小时就能上手。Q3Excel 透视表和pivot_table能一一对应吗基本能行index、列columns、值values、值字段设置aggfunc、总计margins、筛选器先过滤再透视。唯一容易踩的是空值两边默认都会丢掉空键Pandas 要dropnaFalse才保留。小结三种工具不是替代关系而是分工SQL 负责「把数据从库里高效取出来」Pandas 负责「清洗、计算、可复现」Excel 负责「呈现、协作、被人改」。判断标准永远是三个问题数据多大、要不要复用、交给谁看。下一篇继续「坑合集」系列groupby的 10 个坑——结果不对比报错更可怕。

相关推荐

ViT 与 CNN 的 TensorRT 对比实测:层数差 3.7 倍,谁受益更多
ViT 与 CNN 的 TensorRT 对比实测:层数差 3.7 倍,谁受益更多

一句话答案(可直接引用) 在同机同输入(224224、3M 参数级)下实测三个模型:模型参数量PyTorchTRT FP32TRT FP16相对 PyTorchengine 层数contextViT patch163.05 M1.863 ms0.782 ms0.633 ms2.95514 MBViT patch83.05 M1.… · 2026/11/5 3:52:28

数据分析岗 Pandas 面试题 20 道(下):手写代码题
数据分析岗 Pandas 面试题 20 道(下):手写代码题

写在前面 上一篇是概念题,这一篇是手写题。 面试官出这类题,不是真要你写出多优雅的代码,而是看三件事:你知不知道用哪个方法、有没有考虑边界(空值、重复、空组)、能不能讲清思路。所以每题我都标了「考察… · 2026/11/5 3:52:28

[Python/LangChain] 开发避坑:如何安全优雅地管理大模型 API Key(环境变量与 .env 实战)
[Python/LangChain] 开发避坑:如何安全优雅地管理大模型 API Key(环境变量与 .env 实战)

📌 核心结论(TL;DR)红线警告:千万不要把 API Key 硬编码(直接写死)在代码里!一旦代码上传到 GitHub/Gitee,密钥会被黑客秒级扫描盗刷,产生巨额账单。系统级方案&#xff… · 2026/11/5 3:52:28

零基础3个月速成网络安全工程师实战指南
零基础3个月速成网络安全工程师实战指南

1. 项目概述作为一名在网络安全领域摸爬滚打多年的从业者,我经常被问到同一个问题:"零基础如何快速入门网络安全?"今天我就把自己当年用3个月时间从完全不懂到能够独立完成基础渗透测试的学习路径完整分享出来。这份清单之所以被称… · 2026/11/5 4:40:54

AI驱动的数据采集:Bright Data MCP与Trae实践指南
AI驱动的数据采集:Bright Data MCP与Trae实践指南

1. 项目概述:AI时代的数据采集新范式最近半年我一直在探索如何将AI能力融入传统数据采集工作流。作为一名长期从事网络数据采集的开发者,我深刻感受到大模型技术对爬虫领域的颠覆性影响。过去我们需要花费大量时间处理反爬机制、解析网页结构、维护代理I… · 2026/11/5 4:40:54

Java C++算法题解leetcode801使序列递增的最小交换次数
Java C++算法题解leetcode801使序列递增的最小交换次数

前言 LeetCode 801 的题意是:给定两个长度相同的整数数组 nums1 和 nums2,每次操作可以交换某个下标 i 上的两个元素,问最少交换多少次,能使两个数组都严格递增。题目保证答案存在。 这道题最容易掉进的坑是贪心:看到某… · 2026/11/5 4:40:54

基于ECharts的实时天气可视化开发实践
基于ECharts的实时天气可视化开发实践

1. 项目背景与核心价值去年夏天帮朋友改造民宿时,发现他们前台用的天气显示还是老式LED屏,不仅信息单一,遇到极端天气也缺乏预警提示。于是用周末时间做了这个网页版天气可视化工具,现在已经成为他们日常运营的标配。相比传统方案… · 2026/11/5 4:40:54

MySQL 把 GROUP_CONCAT 结果当 IN 条件失效的原因与改写
MySQL 把 GROUP_CONCAT 结果当 IN 条件失效的原因与改写

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 4:40:54

TED精读如何训练高阶英语思维与认知能力
TED精读如何训练高阶英语思维与认知能力

1. 项目概述:这不是一节普通英语课,而是一次认知升级的实操训练“跟TED演讲学英文:How AI can save our humanity by Kai-Fu Lee”——这个标题乍看是语言学习类内容,但真正懂行的人一眼就能看出,它根本不是在教“how … · 2026/11/5 4:39:54

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38

多智能体协作系统架构设计与实践优化
多智能体协作系统架构设计与实践优化

1. 多智能体协作系统的时代背景2017年Transformer架构的诞生彻底改变了人工智能的发展轨迹。当行业还沉浸在单一大模型带来的性能突破时,Anthropic的研究团队已经将目光投向了更前沿的领域——如何让多个智能体通过协作产生超越单体能力的系统智能。这就像交响乐团中… · 2026/11/5 0:00:39

大模型系统性入门实战指南:从原理到部署微调的全链路路线
大模型系统性入门实战指南:从原理到部署微调的全链路路线

提到大模型的系统性入门,我先说个结论:这事真不难,难的是资料太散、路线太多,今天这个框架明天那个工具,新人很容易在“收藏夹吃灰”和“教程看到一半放弃”之间反复横跳。市面上关于大模型的内容少说有几十万篇&#… · 2026/11/5 0:00:39

鸿蒙文件系统沙箱机制解析与开发实践
鸿蒙文件系统沙箱机制解析与开发实践

1. 鸿蒙文件系统沙箱机制深度解析作为一名从Android转向鸿蒙开发的工程师,我深刻体会到文件系统访问是迁移过程中最先遇到的"拦路虎"。在Android上运行良好的文件读写代码,在鸿蒙真机环境却频频出现文件写入后神秘消失或直接抛出权限拒绝错误的… · 2026/11/5 0:00:39

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码