You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于多列条件筛选DataFrame行:现有实现是否最优?

Pandas多条件筛选行:优化基于多列的复杂条件判断

问题背景

我有一个包含多列的Pandas DataFrame,想要基于多个列的条件筛选行。示例数据和初始实现如下:

import pandas as pd
di={"A":[1,2,3,4,5], "B":['Tokyo','Madrid','Professor','helsinki','Tokyo Oliveira'], "C":['250','200//250','250//250//200','12','200//300'], "D":['Left','Right','Left','Right','Right']}
data=pd.DataFrame(di)

我的需求是筛选出满足以下所有条件的行(最终仅第一行会被选中):

  • B列包含"Tokyo"
  • D列为"Left"
  • C列以"//"分割后的首个数值≤200

我最初写了一个处理C列的函数:

def check_200(thecolumn):
    thelist=[]
    for i in thecolumn:
        f=i
        if "//" in f: #split based on //
            z=f.split("//")
            f=z[0]
        f=float(f)
        if f > 200.00:
            thelist.append(True)
        else:
            thelist.append(False)
    return thelist

然后通过多条件组合筛选:

selecteddata=data[(data.B.str.contains("Tokyo")) & (data.D.str.contains("Left"))&(check_200(data.C))]

想请教大家,这是否是最优实现方式?有没有更简便的Pandas原生函数可以满足这类需求?


优化方案

你的思路是对的,但确实可以用Pandas的原生方法让代码更简洁高效,毕竟Pandas的矢量化操作比手动Python循环快得多,而且代码可读性也更强。我们可以分步骤来优化:

  1. 简化C列的首个数值判断
    不用写循环函数,直接用Pandas的字符串方法链式操作就能搞定:
c_condition = data['C'].str.split('//').str[0].astype(float) <= 200

这里str.split('//')会把每个C列的字符串按//分割成列表,str[0]直接提取列表的第一个元素,转成float类型后再和200比较,一步就能得到判断C列条件的布尔Series,比手动循环简洁太多。

  1. 组合所有条件
    剩下的两个条件可以直接用更精准的写法:
  • B列包含"Tokyo":data['B'].str.contains('Tokyo')(这个和你原来的写法一致没问题)
  • D列为"Left":data['D'] == 'Left'(这里用==比str.contains更准确,因为你要的是精确匹配"Left",而不是包含这个字符串)

最后把三个条件用&组合起来,注意每个条件要加括号避免运算优先级问题:

selecteddata = data[
    (data['B'].str.contains('Tokyo')) &
    (data['D'] == 'Left') &
    (data['C'].str.split('//').str[0].astype(float) <= 200)
]
  1. 可选:更贴近自然语言的链式写法
    如果喜欢更紧凑易读的风格,可以用assign先处理C列的数值,再用query筛选:
selecteddata = data.assign(
    c_first_val=data['C'].str.split('//').str[0].astype(float)
).query(
    "B.str.contains('Tokyo') and D == 'Left' and c_first_val <= 200"
).drop(columns='c_first_val')

这种写法把条件逻辑用类似自然语言的方式表达,可读性拉满。

为什么这样更好?

  • 效率更高:Pandas的矢量化操作是基于底层C实现的,比手动Python循环快几倍甚至几十倍,数据量越大差距越明显。
  • 代码更简洁:不需要额外定义函数,所有逻辑一目了然,后续维护起来更方便。
  • 更符合Pandas惯用写法:熟悉Pandas的开发者一眼就能看懂,减少团队协作的沟通成本。

内容的提问来源于stack exchange,提问作者ALI HAIDAR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 07:32:38