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. 实际案例:销售数据分析

最近帮朋友分析一个销售数据集,需要找出:

  1. 华东或华南地区
  2. 销售额大于10万
  3. 退货率低于5%
  4. 产品类别是电子产品或家电

最终代码是这样的:

conditions = (
    (data["地区"].isin(["华东", "华南"]))
    & (data["销售额"] > 100000)
    & (data["退货率"] < 0.05)
    & (data["产品类别"].isin(["电子产品", "家电"]))
)

high_value_orders = data[conditions]

这个案例教会我:好的筛选条件应该像故事一样有逻辑。先确定大范围(地区),再缩小到业务指标(销售额、退货率),最后精确到产品类型。

5. 常见错误与调试技巧

新手常犯的几个错误,我都中过招:

  1. 混淆"&"和"and":在pandas中必须用"&",用Python的"and"会报错
  2. 忘记括号:每个条件都要用括号括起来
  3. 类型不一致:比如字符串和数字比较前要先转换类型

我的调试方法是:

  • 先单独测试每个小条件
  • 用print输出中间结果
  • 对于复杂条件,可以分步构建:
condition1 = data["城市"] == "北京"
condition2 = data["年龄"] > 30
final_condition = condition1 & condition2

6. 高级技巧:使用eval提升性能

对于超大数据集(千万行以上),可以尝试eval():

data.eval("北京年轻人 = (城市 == '北京') & (年龄 < 30)", inplace=True)

eval会利用引擎优化,比普通筛选快得多。不过要注意,eval的语法和普通Python略有不同。

7. 条件筛选的代码可维护性

在团队项目中,我建议:

  1. 把常用条件封装成函数
  2. 用字典管理条件参数
  3. 添加清晰的注释

比如:

def get_high_value_customers(data, min_sales, max_return_rate):
    """获取高价值客户"""
    return data[
        (data["销售额"] > min_sales)
        & (data["退货率"] < max_return_rate)
    ]

这样其他同事调用时一目了然,不用关心具体实现细节。

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐