写在前面上一篇是概念题这一篇是手写题。面试官出这类题不是真要你写出多优雅的代码而是看三件事你知不知道用哪个方法、有没有考虑边界空值、重复、空组、能不能讲清思路。所以每题我都标了「考察点」答题时先说考察点再写代码最后补一句边界处理。先确认示例数据在手边importosimportmkdataifnotos.path.exists(data/sales.csv):mkdata.main()print(示例数据就绪,os.path.exists(data/sales.csv))这段会检查第 1 篇生成的data/目录在不在不在就自动补一次已经有数据时只会打印一行示例数据就绪 True不影响后面的结果。第 11 题每个城市销售额 Top2 的产品考察点sort_valuesgroupby().head()而不是写循环。importpandasaspd dfpd.read_csv(data/sales.csv,encodingutf-8-sig)agg(df.groupby([城市,产品],dropnaFalse)[金额].sum().round(2).reset_index())top2agg.sort_values([城市,金额],ascending[True,False]).groupby(城市).head(2)print(top2.to_string(indexFalse))城市 产品 金额 上海 C-键盘 1246.0 上海 B-鼠标 299.0 北京 C-键盘 178.0 北京 A-笔记本 49.9 广州 C-键盘 356.0 广州 B-鼠标 179.4 杭州 D-显示器 2396.0 杭州 A-笔记本 349.3边界groupby默认丢空键要保留加dropnaFalsehead(2)是「每组前 2 行」不是「前 2 组」。第 12 题找出重复记录并标记考察点duplicated(keepFalse)的用法。importpandasaspd dfpd.read_csv(data/sales.csv,encodingutf-8-sig)dup_maskdf.duplicated(keepFalse)# 把所有重复的每组都标出来print(重复行数含首条,int(dup_mask.sum()))print(df[dup_mask][[订单日期,城市,产品,金额]].to_string(indexFalse))重复行数含首条 4 订单日期 城市 产品 金额 2024-01-06 上海 B-鼠标 149.5 2024-01-06 上海 B-鼠标 149.5 2024-03-15 上海 C-键盘 623.0 2024-03-15 上海 C-键盘 623.0边界keepFalse标记全部keepfirst默认只标后面那条判断业务重复要加subset[主键]。第 13 题按组填缺失值考察点groupby transform而不是apply里写循环。importpandasaspd dfpd.read_csv(data/sales.csv,encodingutf-8-sig)print(填补前缺失,int(df[金额].isna().sum()))# 用「同城市金额中位数」填没有同组数据就退回全局中位数group_meddf.groupby(城市)[金额].transform(median)df[金额_填补]df[金额].fillna(group_med).fillna(df[金额].median())print(填补后缺失,int(df[金额_填补].isna().sum()))print(df.loc[df[金额].isna(),[城市,金额,金额_填补]].to_string(indexFalse))填补前缺失 2 填补后缺失 0 城市 金额 金额_填补 广州 NaN 267.70 北京 NaN 113.95边界同组全是空值时transform(median)仍是 NaN所以要接一次全局兜底。第 14 题宽表转长表再转回去考察点melt/pivot_table互为逆操作。importpandasaspd widepd.DataFrame({城市:[杭州,上海,北京],A-笔记本:[348.9,49.9,49.9],C-键盘:[1157.0,623.0,178.0],})longwide.melt(id_vars城市,var_name产品,value_name销售额)print(long.head(4).to_string(indexFalse))print(----)backlong.pivot_table(index城市,columns产品,values销售额,aggfuncsum)print(back.to_string())print(形状还原,back.shapewide.set_index(城市).shape)城市 产品 销售额 杭州 A-笔记本 348.9 上海 A-笔记本 49.9 北京 A-笔记本 49.9 杭州 C-键盘 1157.0 ---- 产品 A-笔记本 C-键盘 城市 上海 49.9 623.0 北京 49.9 178.0 杭州 348.9 1157.0 形状还原 True第 15 题算每个城市的环比增长率考察点pct_change或shift加上排序这个前提。importpandasaspd dfpd.read_csv(data/sales.csv,encodingutf-8-sig)df[订单日期]pd.to_datetime(df[订单日期],format%Y-%m-%d)monthly(df.groupby([df[城市],df[订单日期].dt.to_period(M).astype(str)])[金额].sum().rename(销售额).reset_index().rename(columns{订单日期:月份}))monthlymonthly.sort_values([城市,月份])# 环比必须先排序monthly[环比(%)](monthly.groupby(城市)[销售额].pct_change()*100).round(1)print(monthly.to_string(indexFalse))城市 月份 销售额 环比(%) 上海 2024-01 299.0 NaN 上海 2024-03 1246.0 316.7 北京 2024-01 178.0 NaN 北京 2024-03 49.9 -72.0 北京 2024-04 0.0 -100.0 广州 2024-02 179.4 NaN 广州 2024-05 356.0 98.4 杭州 2024-01 149.7 NaN 杭州 2024-02 199.6 33.3 杭州 2024-04 59.8 -70.0 杭州 2024-05 2396.0 3906.7边界不排序直接pct_change会算错每组第一个月没有上月结果是 NaN这是对的。第 16 题把一张表分成「有匹配」和「没匹配」两部分考察点merge(indicatorTrue)_merge列。importpandasaspd orderspd.read_csv(data/orders.csv,encodingutf-8-sig)customerspd.read_csv(data/customers.csv,encodingutf-8-sig)morders.merge(customers,on客户ID,howleft,indicatorTrue)print(m[_merge].value_counts().to_string())print(---- 没有客户信息的订单)print(m.loc[m[_merge]left_only,[订单号,客户ID,订单金额]].to_string(indexFalse))print(---- 只保留匹配上的)print(m.loc[m[_merge]both,[订单号,客户名称,订单金额]].to_string(indexFalse))_merge both 5 left_only 1 right_only 0 ---- 没有客户信息的订单 订单号 客户ID 订单金额 A005 C05 88.0 ---- 只保留匹配上的 订单号 客户名称 订单金额 A001 恒信科技 320.0 A002 云图文化 158.5 A003 海通物流 990.0 A004 云图文化 420.0 A006 恒信科技 265.5第 17 题统计每个城市的订单数和客单价并按客单价排序考察点命名聚合 派生指标。importpandasaspd dfpd.read_csv(data/sales.csv,encodingutf-8-sig)df[金额]df[金额].fillna((df[数量]*df[单价]).round(2))cleandf[df[金额]0].drop_duplicates()stat(clean.groupby(城市,dropnaFalse).agg(订单数(金额,size),销售额(金额,sum),客单价(金额,mean)).round(2).sort_values(客单价,ascendingFalse))print(stat.to_string())订单数 销售额 客单价 城市 杭州 4 3404.1 851.02 北京 3 1425.9 475.30 上海 2 772.5 386.25 广州 2 535.4 267.70 NaN 1 149.7 149.70边界size数行数、count会跳过 NaN——面试时说清这个区别很加分。第 18 题连续日期怎么判断考察点日期差 分组编号gaps and islands 的简化版。importpandasaspd datespd.to_datetime([2024-01-01,2024-01-02,2024-01-03,2024-01-06,2024-01-07,])dailypd.Series(1,indexdates).rename(订单数).to_frame()fulldaily.asfreq(D)# 补齐缺失日期缺失处为 NaNprint(full.to_string())print(---- 缺失的日期)print(full[full[订单数].isna()].index.strftime(%Y-%m-%d).tolist())订单数 2024-01-01 1.0 2024-01-02 1.0 2024-01-03 1.0 2024-01-04 NaN 2024-01-05 NaN 2024-01-06 1.0 2024-01-07 1.0 ---- 缺失的日期 [2024-01-04, 2024-01-05]边界asfreq需要 DatetimeIndex如果只是判断「相邻两行差几天」用diff().dt.days更直接。第 19 题把金额分箱并统计各箱订单数考察点pd.cut指定边界value_counts排序。importpandasaspd dfpd.read_csv(data/sales.csv,encodingutf-8-sig)df[金额]df[金额].fillna((df[数量]*df[单价]).round(2))df[档位]pd.cut(df[金额],bins[-1000,0,100,500,1000,10000],labels[异常,0-100,100-500,500-1000,1000])print(df[档位].value_counts().sort_index().to_string())print(----)print(df.groupby(档位,observedTrue)[金额].agg([size,sum]).round(2).to_string())档位 异常 1 0-100 2 100-500 9 500-1000 2 1000 2 ---- size sum 档位 异常 1 -599.0 0-100 2 109.7 100-500 9 1690.8 500-1000 2 1246.0 1000 2 4193.0第 20 题一行代码做透视表考察点pivot_table的参数是否熟。importpandasaspd dfpd.read_csv(data/sales.csv,encodingutf-8-sig)ptpd.pivot_table(df,index城市,columns产品,values金额,aggfuncsum,fill_value0,marginsTrue,margins_name总计)print(pt.round(1).to_string())产品 A-笔记本 B-鼠标 C-键盘 D-显示器 总计 城市 上海 0.0 299.0 1246.0 0.0 1545.0 北京 49.9 0.0 178.0 0.0 227.9 广州 0.0 179.4 356.0 0.0 535.4 杭州 349.3 59.8 0.0 2396.0 2805.1 总计 399.2 538.2 1780.0 2396.0 5113.4边界pivot_table默认丢掉分组键为空的行要保留加dropnaFalse。手写题的三个加分动作先说思路「我会先按城市分组再取每组前 2 行」然后再写代码主动提边界空值、重复、空组、索引非默认——每题补一句面试官会觉得你真用过写完验证print(result.head())或断言行数别写完就交。常见问题Q1手写题可以查文档吗线上笔试通常不行现场面试可以问「我能查一下参数吗」。面试官更在意思路允许查的时候大方查查完说「我确认一下参数名」。Q2groupby().head(2)和nlargest有什么区别head(2)要在已排序的前提下用nlargest(2, 金额)内部做部分排序不在意原顺序。单列 TopN 用nlargest多列组合排序用sort_valueshead。Q3为什么我的分组结果少了几行groupby默认dropnaTrue分组键为空的行会被整行丢掉。加dropnaFalse或先把空值填成「未知」。小结这 10 道手写题覆盖了实际工作里最常用的套路TopN、去重标记、分组填充、宽长表转换、环比、匹配拆分、命名聚合、日期补齐、分箱、透视。每道题都能用两三行解决——面试真正考的是「你知不知道有两三行的解法」而不是能不能写五十行。二十道题到这里就齐了。下一篇换个维度同一个需求Pandas、Excel、SQL 三种写法摆在一起比帮你判断什么时候该换工具。
企业数字化 ERP 产品动态
相关推荐
VSP 到底是什么,ABAP Agent 开发里那座连接 MCP 与 ADT 的桥 最近在 ABAP Agentic Development 相关资料里,vsp 这个名字出现得越来越频繁。特别是在 Claude Code、GitHub Copilot、Codex、MCP、ADT 这些关键词同时出现的时候,经常会看到类似这样的连接关系。
Claude Code → MCP → VSP → ADT → SAP
这很容易造成一个误解,以为 VS… · 2026/11/5 3:51:18
零基础3个月速成网络安全工程师实战指南 1. 项目概述作为一名在网络安全领域摸爬滚打多年的从业者,我经常被问到同一个问题:"零基础如何快速入门网络安全?"今天我就把自己当年用3个月时间从完全不懂到能够独立完成基础渗透测试的学习路径完整分享出来。这份清单之所以被称… · 2026/11/5 4:40:54
AI驱动的数据采集:Bright Data MCP与Trae实践指南 1. 项目概述:AI时代的数据采集新范式最近半年我一直在探索如何将AI能力融入传统数据采集工作流。作为一名长期从事网络数据采集的开发者,我深刻感受到大模型技术对爬虫领域的颠覆性影响。过去我们需要花费大量时间处理反爬机制、解析网页结构、维护代理I… · 2026/11/5 4:40:54
Java C++算法题解leetcode801使序列递增的最小交换次数 前言
LeetCode 801 的题意是:给定两个长度相同的整数数组 nums1 和 nums2,每次操作可以交换某个下标 i 上的两个元素,问最少交换多少次,能使两个数组都严格递增。题目保证答案存在。
这道题最容易掉进的坑是贪心:看到某… · 2026/11/5 4:40:54
基于ECharts的实时天气可视化开发实践 1. 项目背景与核心价值去年夏天帮朋友改造民宿时,发现他们前台用的天气显示还是老式LED屏,不仅信息单一,遇到极端天气也缺乏预警提示。于是用周末时间做了这个网页版天气可视化工具,现在已经成为他们日常运营的标配。相比传统方案… · 2026/11/5 4:40:54
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精读如何训练高阶英语思维与认知能力 1. 项目概述:这不是一节普通英语课,而是一次认知升级的实操训练“跟TED演讲学英文:How AI can save our humanity by Kai-Fu Lee”——这个标题乍看是语言学习类内容,但真正懂行的人一眼就能看出,它根本不是在教“how … · 2026/11/5 4:39:54
双极步进电机控制实战: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 步进电机驱动实战解析 /* 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工业级双极步进电机控制方案 /* 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驱动调试 /* 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 步进电机驱动实战解析 /* 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工业级双极步进电机控制方案 /* 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