如何用&运算符链式连接条件?Pandas数据框过滤代码优化咨询
更Pythonic的Pandas多列数值行过滤实现
需求回顾
需要过滤Pandas DataFrame,返回指定列列表中所有列均为数值型数据的行。示例如下:
| a | b | c | |
|---|---|---|---|
| 1 | 1 | 1 | 1 |
| 2 | 1 | g | 8 |
| 3 | h | 1 | 1 |
| 4 | 2 | 2 | 2 |
- 传入列列表
['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
相关产品推荐
相关产品推荐

