使用用户输入过滤Pandas DataFrame返回空数据框的问题排查
问题原因与解决方法
核心问题
你的代码返回空DataFrame的根本原因是在isin()方法里错误地将参数嵌套了一层列表。比如FarolAging1本身已经是列表类型,你却写成df['FarolAging'].isin([FarolAging1]),这会让Pandas检查列中的值是否属于[['Vermelho']]这个嵌套列表——而你的DataFrame里的FarolAging列都是字符串,自然匹配不到任何结果。
修复后的代码
import pandas as pd df = pd.DataFrame({ "FarolAging": ["Vermelho", "Verde", "Amarelo"], "Dias Pendentes": ["20 dias", "40 dias", "60 dias"], "Produto": ["Prod1", "Prod1", "Prod2"], "Officer": ["Alexandre Denardi", "Alexandre Denardi", "Lucas Fernandes"], "Analista": ["Guilherme De Oliveira Moura", "Leonardo Silva", "Julio Cesar"], "Coord": ["Anna Claudia", "Bruno", "Bruno"] }) FarolAging1 = ['Vermelho'] DiasPendentes = [] Produto = [] Officer = [] def func(FarolAging1, DiasPendentes, Produto, Officer): # 空列表时替换为对应列的唯一值 if len(Officer) < 1: Officer = df['Officer'].unique() if len(FarolAging1) < 1: FarolAging1 = df['FarolAging'].unique() if len(DiasPendentes) < 1: DiasPendentes = df['Dias Pendentes'].unique() if len(Produto) < 1: Produto = df['Produto'].unique() # 去掉isin()里的外层嵌套列表 dados2 = df.loc[ df['FarolAging'].isin(FarolAging1) & df['Dias Pendentes'].isin(DiasPendentes) & df['Produto'].isin(Produto) & df['Officer'].isin(Officer) ] print(dados2) func(FarolAging1, DiasPendentes, Produto, Officer)
额外优化建议
- 给函数参数设置默认空列表,避免外部单独定义变量,让代码更简洁:
def func(FarolAging1=[], DiasPendentes=[], Produto=[], Officer=[]): # 函数逻辑不变 - 如果用户输入是单一值而非列表,可以在函数开头先把单一值转为列表,提升函数兼容性:
def func(FarolAging1=[], DiasPendentes=[], Produto=[], Officer=[]): # 处理单一值输入 FarolAging1 = [FarolAging1] if not isinstance(FarolAging1, list) else FarolAging1 DiasPendentes = [DiasPendentes] if not isinstance(DiasPendentes, list) else DiasPendentes Produto = [Produto] if not isinstance(Produto, list) else Produto Officer = [Officer] if not isinstance(Officer, list) else Officer # 后续逻辑不变
内容的提问来源于stack exchange,提问作者Lucas Brecht Fernandes
相关产品推荐
相关产品推荐

