乐于分享
好东西不私藏

Excel 点半天的筛选、排序、求和,3 行代码就够了

Excel 点半天的筛选、排序、求和,3 行代码就够了
《不是一条狗》第 07 篇。上一篇把表读进来了,这一篇开始真正“动”它——你最熟的筛选、排序、求和,全换成代码。

天天在 Excel 里做的三件事

打开一张销售明细,财务最常做的无非三个动作:筛出符合条件的、按某列排个序、再求和看个总数。

在 Excel 里这是点筛选按钮、点排序、拉 SUM。在 pandas 里,每个动作就是一行代码——而且几十张表都能一键重跑。这一篇把这三件事讲透,它们是后面所有分析的基础积木。

筛选:把符合条件的挑出来

最基本的,挑出“金额大于 5 万”的大额订单:

import pandas as pddf = pd.read_excel("销售明细.xlsx")big = df[df["金额"] > 50000]print(big)
df["金额"] > 50000 会对每一行判断真假,df[...] 再把“真”的那些行留下来。这就是 Excel 的“筛选”。

多个条件叠加,比如“华东区且大于 5 万”:

big_east = df[(df["区域"] == "华东") & (df["金额"] > 50000)]
多个条件用 &(且)、|(或)连接,每个条件都要用括号括起来,这是新手最常忘的一点。

几种特别常用的筛选写法,记住能省很多事:

金额在某个区间(含两端)df[df["金额"].between(10000, 50000)]客户是这几个里的任意一个(相当于 Excel 里勾选多个)df[df["客户"].isin(["云栖餐饮""广发包装"])]客户名里"包含"某个字(模糊筛选)df[df["客户"].str.contains("科技")]反向筛选:不满足条件的,前面加 ~df[~df["客户"].isin(["云栖餐饮"])]
between 对应 Excel 里“大于等于且小于等于”,isin 对应筛选框里勾多个值,str.contains 对应“包含”的文本筛选——这些你在 Excel 里都用过,只是现在用代码表达。

排序:按某列从高到低

df.sort_values("金额"ascending=False)
ascending=False 是从大到小,改成 True 或去掉就是从小到大。

按多列排序也很常用,比如“先按区域分,再在每个区域里按金额从高到低”:

df.sort_values(["区域""金额"], ascending=[TrueFalse])
列名和升降序都用列表一一对应。

只想看“最高/最低的几笔”,有更直接的写法,不用先排序再 head:

df.nlargest(3"金额")    # 金额最高的 3 笔df.nsmallest(3"金额")   # 金额最低的 3 笔

求和与分组汇总:SUMIF 的升级版

整列求和:

print(df["金额"].sum())
但财务更常要的是“分类汇总”,相当于 Excel 的 SUMIF 或数据透视。一行 groupby:
print(df.groupby("客户")["金额"].sum())
groupby("客户") 先按客户分组,["金额"].sum() 再对每组的金额求和。每个客户的合计全出来了。把 sum 换成别的就是别的汇总:mean(平均)、count(笔数)、max/min(最大最小)。

一次算好几个指标,用 agg:

print(df.groupby("区域")["金额"].agg(["sum""mean""count"]))
一行就得到每个区域的合计、平均、笔数,三列并排。

按多个维度分组也行,比如“区域 + 月份”:

print(df.groupby(["区域""月份"])["金额"].sum())
(如果你想要的是区域做行、月份做列的那种二维表,那就是下下篇的“数据透视表”了。)

顺手:新增一个计算列

筛选汇总之外,经常还要“算一列”。比如给金额加上 13% 的税:

df["含税金额"] = df["金额"] * 1.13
等号左边写新列名,右边写算式,一整列就算好了——相当于 Excel 里拉一列公式,但不用往下拖。

⚠️ 避坑

KeyError:列名写错了。先 print(df.columns) 看真实列名,复制粘贴别手打。

多条件不生效:忘了给每个条件加括号,或把 & 写成了 and(pandas 里要用 & / |)。

str.contains 报错:那一列里有空值。加个参数 na=False 跳过空值:df["客户"].str.contains("科技", na=False)。

筛选对不上、值看着一样却选不中:列里有看不见的空格。先 df["客户"] = df["客户"].str.strip()(第 10 篇细讲)。

小作业

拿你自己的一张表,把这几件事都做一遍:

  1. 用 between 或 isin 做一次稍复杂的筛选;
  2. 按两列排序,或用 nlargest 看前几名;
  3. 用 groupby(...).agg(["sum","count"]) 算出每个类别的合计和笔数;
  4. 新增一个计算列(比如税额、单价、占比)。
做完你会发现:Excel 点半天的活,几行代码就复刻了,而且换张表照样跑。

📌 完整代码 + 示例数据怎么拿?

本篇代码和脱敏示例数据都已开源。关注公众号「不是一条狗」,回复关键词 github地址,即可获取完整代码仓库链接。

下一篇

《多表 VLOOKUP 的 Python 版(merge)》——两张表怎么按客户名拼到一起,告别 VLOOKUP 的 #N/A。

公众号:不是一条狗|跟着做,把最烦的活一个个干掉。