DataFrame列值校验异常:自定义函数未抛异常及断言失效问题
问题分析与修复方案
一、原函数的核心问题
原函数中判断导演名是否存在的代码存在运算符优先级错误:
if director_name in director_df[filter_column].tolist()== False:
Python里==的优先级比in高,这段代码实际会先执行director_df[filter_column].tolist() == False(结果恒为False),再判断director_name in False,这显然永远不成立,导致跳过异常抛出逻辑,直接返回空DataFrame。
二、两个断言的错误原因
第一个断言触发
KeyError: 'siva'
错误地用director_name作为列名去取DataFrame的列,当director_name是具体人名(比如'siva')时,DataFrame中没有对应列,因此报错。正确应该使用传入的filter_column参数指定要检查的列:# 错误写法 assert director_name in director_df[director_name].values,"The name does not exist in the director column" # 修正后 assert director_name in director_df[filter_column].values, "The name does not exist in the director column"第二个断言触发"The truth value of a Series is ambiguous"
director_df[filter_column].isin([director_name])返回的是布尔类型的Series,assert无法直接判断整个Series的真值,必须用.any()来检查是否存在至少一个匹配项:# 错误写法 assert director_df[filter_column].isin([director_name]),"The name does not exist in the director column" # 修正后 assert director_df[filter_column].isin([director_name]).any(), "The name does not exist in the director column"
三、修复后的完整函数
修复运算符优先级问题,同时用更高效的isin+any替代转list的判断方式:
def director_release_year(director_df, filter_column, director_name): if filter_column not in director_df.columns: raise Exception("the column is not available in the DataFrame") # 校验导演名是否存在于指定列 if not director_df[filter_column].isin([director_name]).any(): raise ValueError("the column doesn't have the value") # 过滤目标数据 df = director_df[director_df[filter_column] == director_name] return df
内容的提问来源于stack exchange,提问作者shiviz
相关产品推荐
相关产品推荐

