我的知识记录

Python Excel按条件筛选数据

用pandas布尔索引按多条件筛选Excel数据,支持大于小于、等于、包含、多条件与或非,导出筛选结果到新表,比Excel自动筛选更快更稳。

场景痛点

从几万行数据里筛出"金额大于1000且地区是华东"的记录,Excel自动筛选要点好几层,条件复杂了还容易漏。用Python写死条件脚本,下次数据更新跑一下就行,结果直接导出。

用到的库

pip install pandas openpyxl

完整代码

import pandas as pd

def filter_demo(input_file, output_file):
df = pd.read_excel(input_file)

# 1. 单条件:金额大于1000
r1 = df[df["金额"] > 1000]

# 2. 多条件且(&):金额>1000 且 地区=="华东"
r2 = df[(df["金额"] > 1000) & (df["地区"] == "华东")]

# 3. 多条件或(|):地区是华东 或 华南
r3 = df[df["地区"].isin(["华东", "华南"])]

# 4. 文本包含:姓名包含"张"
r4 = df[df["姓名"].astype(str).str.contains("张", na=False)]

# 5. 多条件组合:金额>1000 且 (地区是华东 或 华南) 且 姓名包含"张"
r5 = df[
(df["金额"] > 1000) &
(df["地区"].isin(["华东", "华南"])) &
(df["姓名"].astype(str).str.contains("张", na=False))
]

# 写入不同sheet
with pd.ExcelWriter(output_file, engine="openpyxl") as writer:
r1.to_excel(writer, sheet_name="金额大于1000", index=False)
r2.to_excel(writer, sheet_name="华东大额", index=False)
r3.to_excel(writer, sheet_name="华东或华南", index=False)
r4.to_excel(writer, sheet_name="姓张", index=False)
r5.to_excel(writer, sheet_name="组合条件", index=False)

print(f"原始{len(df)}行")
print(f"  金额>1000: {len(r1)}")
print(f"  华东且金额>1000: {len(r2)}")
print(f"  华东或华南: {len(r3)}")
print(f"  姓张: {len(r4)}")
print(f"  组合条件: {len(r5)}")

if __name__ == "__main__":
filter_demo("./销售明细.xlsx", "./筛选结果.xlsx")

代码讲解

  • 布尔索引:df[条件],条件本身是一个由True/False组成的Series。
  • 多条件必须用 &(与)、|(或),每个条件用小括号包起来,不能用 and/or
  • isin([...]) 等价于"等于这几个值之一",比写多个 ==| 简洁。
  • str.contains("张") 做模糊匹配,na=False 把空值当作不匹配,避免报错。
  • ExcelWriter 把多个筛选结果写到同一文件不同sheet,方便对比。

运行结果

生成 筛选结果.xlsx,里面5个工作表分别对应5种筛选结果,控制台打印每个条件命中的行数。

注意事项

  • 文本比较默认区分大小写,需要忽略大小写用 str.contains("张", case=False)
  • 空值参与比较会变成 NaN,布尔索引里NaN当作False,不会报错但会静默丢弃,重要数据先 fillna
  • 日期筛选记得先 pd.to_datetime(df["日期"]) 转成日期类型再比较。

Python Excel按条件筛选数据

标签:

更新时间:2026-09-15 09:07:47

上一篇:Python Excel设置冻结窗格:冻结表头行和首列

下一篇:Python Excel提取指定列到新表:按列名一键导出