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

如何实现多列条件过滤DataFrame,无参数时返回全量数据?

问题解决:多参数过滤CSV数据的find函数优化

需求

编写名为find的函数,处理存储人员信息的CSV文件:

  • 传入任意数量的参数(first/last/city)时,按所有给定参数过滤DataFrame
  • 无参数传入时返回完整的DataFrame

示例CSV数据

FirstName    LastName   City
Matt          Fred      Austin
Jim           Jack      NYC
Larry         Bob       Houston
Matt          Spencer   NYC

预期调用效果

find(first="Matt", last="Fred")
# 输出:Matt   Fred Austin

find()
# 输出:完整DataFrame

find(last="Spencer")
# 输出:Matt Spencer NYC

find(city="NYC")
# 输出:所有居住在NYC的人员数据

问题代码(存在逻辑错误)

def find(first=None, last=None, city=None):
    file= pd.read_csv(list)
    searched = file.loc[(file["FirstName"] == first) & (file["LastName" == last]) & (file["City"] == city)]
    return searched

问题分析

  1. 语法错误:file["LastName" == last]是错误写法,正确应为file["LastName"] == last
  2. 逻辑缺陷:未传入的参数值为None,直接用== None会导致过滤条件不成立(比如只传first="Matt"时,last和city为None,file["LastName"] == None匹配不到任何行)
  3. 其他问题:缺少pandas导入,pd.read_csv(list)中的list是无效变量,应替换为实际CSV文件路径

修复后的代码

import pandas as pd

def find(first=None, last=None, city=None):
    # 替换为你的实际CSV文件路径,空格分隔的CSV用delim_whitespace=True处理
    df = pd.read_csv("people.csv", delim_whitespace=True)
    
    # 初始条件:全部保留
    filter_condition = pd.Series([True] * len(df), index=df.index)
    
    # 只对传入的参数添加过滤条件
    if first is not None:
        filter_condition &= df["FirstName"] == first
    if last is not None:
        filter_condition &= df["LastName"] == last
    if city is not None:
        filter_condition &= df["City"] == city
    
    return df[filter_condition]

代码说明

  • 用delim_whitespace=True适配空格分隔的CSV数据(如果是逗号分隔,删除该参数即可)
  • 初始过滤条件设为全True,确保无参数时返回完整DataFrame
  • 仅当参数不为None时才添加对应过滤条件,避免未传参数导致的无效匹配
  • 修正了原代码的语法错误,补充了必要的库导入

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 06:35:27