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

如何用&运算符链式连接条件?Pandas数据框过滤代码优化咨询

更Pythonic的Pandas多列数值行过滤实现

需求回顾

需要过滤Pandas DataFrame,返回指定列列表中所有列均为数值型数据的行。示例如下:

abc
1111
21g8
3h11
4222
  • 传入列列表['b', 'c'],预期返回行1、3、4;
  • 传入列列表['a'],预期返回行1、2、4。

原实现的优化方向

原代码通过循环逐个拼接&条件,逻辑正确但不够简洁。以下是两种更Pythonic的实现方式:

方法1:用functools.reduce链式合并条件

类似字符串join的思路,用reduce把列表中的布尔序列逐个通过&合并:

import typing
import pandas as pd
from functools import reduce

def filter_df(dataframe: pd.DataFrame, filter_columns: typing.List[str]) -> pd.DataFrame:
    # 生成每个列的数值判断布尔序列
    conditions = [dataframe[col].str.isnumeric() for col in filter_columns]
    # 链式合并所有逻辑与条件
    combined_condition = reduce(lambda x, y: x & y, conditions)
    return dataframe[combined_condition]

方法2:利用Pandasall方法实现向量化判断

更贴合Pandas的向量化操作风格,直接对布尔结果按行取“全为真”:

import typing
import pandas as pd

def filter_df(dataframe: pd.DataFrame, filter_columns: typing.List[str]) -> pd.DataFrame:
    # 对指定列做数值判断后,按行检查是否所有列均为数值型
    combined_condition = dataframe[filter_columns].apply(lambda col: col.str.isnumeric()).all(axis=1)
    return dataframe[combined_condition]

方法说明

  • 方法1完全等价于原循环逻辑,只是用reduce简化了循环代码;
  • 方法2利用Pandas的内置方法,代码更简洁,且大数据量下性能更优(向量化操作比循环高效);
  • 两种方法都能满足需求,可根据习惯选择。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 18:50:28