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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 12:07:32