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["日期"])转成日期类型再比较。

更新时间:2026-09-15 09:07:47
上一篇:Python Excel设置冻结窗格:冻结表头行和首列