Python中基于多列可选条件筛选DataFrame行的实现咨询
动态筛选DataFrame行的实现方案
问题场景
现有一个包含col1、col2、col3三列的DataFrame,支持用户输入任意一列、两列或三列的筛选值(任意组合,如仅col1、col1+col2、col2+col3等),未指定筛选值的列(用nil表示)不做筛选,保留所有行。
示例DataFrame:
col1 col2 col3 1 3 3 3 4 5 5 2 1 3 4 2
示例需求:
- 仅输入
col2=4时,返回第2、4行 - 仅输入
col1=1时,返回第1行
原逻辑存在的问题:
- 直接用
and连接布尔序列会报错,Pandas中需用&进行向量级别的逻辑与操作 - 未处理
nil(即不筛选)的情况 - 公式中写错了列名(
df['col1'] == z应为df['col3'] == z)
解决方案
通过初始化全True掩码+逐步叠加筛选条件的方式实现,只对非nil的列应用筛选规则。
代码实现
首先创建示例DataFrame:
import pandas as pd # 构建示例数据 data = { 'col1': [1, 3, 5, 3], 'col2': [3, 4, 2, 4], 'col3': [3, 5, 1, 2] } df = pd.DataFrame(data)
方式1:基于字典的通用筛选
适合动态生成筛选条件的场景:
# 定义筛选条件,None代表不筛选对应列 filter_conditions = { 'col1': None, 'col2': 4, 'col3': None } # 初始化掩码:默认保留所有行 mask = pd.Series([True] * len(df), index=df.index) # 遍历条件,叠加筛选规则 for col, value in filter_conditions.items(): if value is not None: mask &= (df[col] == value) # 应用筛选 filtered_df = df[mask] print(filtered_df)
方式2:封装为函数,方便调用
适合固定列的场景,可直接传入需要筛选的列值:
def filter_df(df, col1=None, col2=None, col3=None): # 初始化全True掩码 mask = pd.Series([True] * len(df), index=df.index) # 逐个处理筛选条件 if col1 is not None: mask &= (df['col1'] == col1) if col2 is not None: mask &= (df['col2'] == col2) if col3 is not None: mask &= (df['col3'] == col3) return df[mask] # 示例调用:仅筛选col2=4 result1 = filter_df(df, col2=4) print(result1) # 示例调用:仅筛选col1=1 result2 = filter_df(df, col1=1) print(result2) # 示例调用:同时筛选col1=3和col3=2 result3 = filter_df(df, col1=3, col3=2) print(result3)
代码说明
- 掩码
mask初始为全True,代表默认保留所有行 - 对每个非
None的筛选条件,用&将当前掩码与该列的布尔序列(df[col] == value)进行逻辑与操作,实现多条件叠加 - 未指定筛选值的列不会修改掩码,自然保留所有行
内容的提问来源于stack exchange,提问作者Ali
相关产品推荐
相关产品推荐

