pandas多条件筛选实战:从基础逻辑到高效组合技巧
1. pandas多条件筛选基础入门
第一次用pandas做多条件筛选时,我完全被那一堆括号和符号搞晕了。后来才发现,只要掌握几个基本符号,就能玩转数据筛选。咱们先从最基础的"与"、"或"筛选说起。
或筛选用的是竖线符号"|",就像生活中的"或者"。比如你想找北京或者上海的用户:
import pandas as pd
# 假设有个用户数据表
data = pd.DataFrame({
"城市": ["北京", "上海", "广州", "北京", "深圳"],
"年龄": [25, 30, 28, 32, 27]
})
# 找出北京或上海的用户
beijing_or_shanghai = data[(data["城市"] == "北京") | (data["城市"] == "上海")]
与筛选用的是"&"符号,相当于"并且"。比如要找北京且年龄大于30的用户:
beijing_and_over30 = data[(data["城市"] == "北京") & (data["年龄"] > 30)]
这里有个坑我踩过好几次:括号绝对不能省。因为"|"和"&"的优先级比"=="高,不加括号会报错。就像数学里的"先乘除后加减",pandas也有自己的运算顺序规则。
2. 复杂条件组合实战技巧
实际项目中,条件往往比上面例子复杂得多。我处理过一个电商数据,需要同时满足5个条件,代码差点写成"面条式"——又长又难读。后来摸索出几个实用技巧:
2.1 多条件清晰写法
当条件超过3个时,建议拆分成多行:
condition = (
(data["城市"] == "北京")
& (data["年龄"] > 25)
& (data["年龄"] < 35)
& (data["职业"].str.contains("工程师"))
)
result = data[condition]
这样写有两个好处:一是容易阅读,二是调试时可以单独检查每个条件。
2.2 动态条件构建
有时候条件列表是动态生成的,比如用户在前端勾选了多个筛选条件。这时候可以用列表推导式:
cities = ["北京", "上海", "广州"]
conditions = [data["城市"] == city for city in cities]
final_condition = conditions[0]
for cond in conditions[1:]:
final_condition |= cond # 相当于多个"或"
2.3 处理空值情况
真实数据总会有缺失值,直接筛选可能出错。我常用的解决方案是:
# 先填充空值再筛选
data_filled = data.fillna({"年龄":0})
# 或者排除空值
data_notnull = data[data["年龄"].notnull()]
3. 性能优化实战心得
当数据量达到百万级时,筛选操作可能变得很慢。经过多次性能测试,我总结出几个提速技巧:
3.1 使用query方法
对于复杂条件,query()往往比直接筛选更快:
result = data.query("城市 == '北京' and 年龄 > 30")
query()的语法更接近自然语言,而且引擎底层做了优化。
3.2 避免链式操作
这样的代码性能很差:
# 不推荐写法
result = data[data["城市"] == "北京"][data["年龄"] > 30]
应该一次性完成所有条件筛选。
3.3 善用isin
当需要匹配多个值时,isin比多个"或"条件高效得多:
# 高效写法
cities = ["北京", "上海", "广州"]
result = data[data["城市"].isin(cities)]
在我的测试中,对于10万行数据,isin比多个"|"条件快3倍左右。
4. 实际案例:销售数据分析
最近帮朋友分析一个销售数据集,需要找出:
- 华东或华南地区
- 销售额大于10万
- 退货率低于5%
- 产品类别是电子产品或家电
最终代码是这样的:
conditions = (
(data["地区"].isin(["华东", "华南"]))
& (data["销售额"] > 100000)
& (data["退货率"] < 0.05)
& (data["产品类别"].isin(["电子产品", "家电"]))
)
high_value_orders = data[conditions]
这个案例教会我:好的筛选条件应该像故事一样有逻辑。先确定大范围(地区),再缩小到业务指标(销售额、退货率),最后精确到产品类型。
5. 常见错误与调试技巧
新手常犯的几个错误,我都中过招:
- 混淆"&"和"and":在pandas中必须用"&",用Python的"and"会报错
- 忘记括号:每个条件都要用括号括起来
- 类型不一致:比如字符串和数字比较前要先转换类型
我的调试方法是:
- 先单独测试每个小条件
- 用print输出中间结果
- 对于复杂条件,可以分步构建:
condition1 = data["城市"] == "北京"
condition2 = data["年龄"] > 30
final_condition = condition1 & condition2
6. 高级技巧:使用eval提升性能
对于超大数据集(千万行以上),可以尝试eval():
data.eval("北京年轻人 = (城市 == '北京') & (年龄 < 30)", inplace=True)
eval会利用引擎优化,比普通筛选快得多。不过要注意,eval的语法和普通Python略有不同。
7. 条件筛选的代码可维护性
在团队项目中,我建议:
- 把常用条件封装成函数
- 用字典管理条件参数
- 添加清晰的注释
比如:
def get_high_value_customers(data, min_sales, max_return_rate):
"""获取高价值客户"""
return data[
(data["销售额"] > min_sales)
& (data["退货率"] < max_return_rate)
]
这样其他同事调用时一目了然,不用关心具体实现细节。
更多推荐



所有评论(0)