筛选含另一列表未出现值的行:Pandas代码结果异常排查
问题:筛选符合指定后缀规则的行
需求是得到4个True和1个False的结果(最后一行返回False),现有Pandas代码运行后输出全True,不符合预期。
现有代码
import pandas as pd bucket_file_extensions_df = pd.DataFrame({ "bucket_file_extensions": [["NoExt", "NoExt", "json"], ["log.gz"], ["log.gz"], ["yml", "yml", "my-file.yaml"], ["bucket.blah", "json"]] }) extension_df = pd.DataFrame({ "non_data_extenions": ["NoExt", "json", "gz", "yml", "yaml"] }) extensions_as_tuple = tuple(extension_df.non_data_extenions.unique()) result = bucket_file_extensions_df.bucket_file_extensions.apply( lambda str_list: any(s.endswith(extensions_as_tuple) for s in str_list)) print(result)
当前输出
0 True 1 True 2 True 3 True 4 True Name: bucket_file_extensions, dtype: bool
预期结果
返回4个True和1个False,其中最后一行需返回False:
0 True 1 True 2 True 3 True 4 False Name: bucket_file_extensions, dtype: bool
解决方案
原代码使用any()的逻辑是「只要有一个元素匹配后缀就返回True」,这和预期逻辑不符。要实现预期结果,需要判断「该行所有元素是否都能匹配指定后缀」,将any()替换为all()即可:
import pandas as pd bucket_file_extensions_df = pd.DataFrame({ "bucket_file_extensions": [["NoExt", "NoExt", "json"], ["log.gz"], ["log.gz"], ["yml", "yml", "my-file.yaml"], ["bucket.blah", "json"]] }) extension_df = pd.DataFrame({ "non_data_extenions": ["NoExt", "json", "gz", "yml", "yaml"] }) extensions_as_tuple = tuple(extension_df.non_data_extenions.unique()) # 将any()替换为all(),判断所有元素是否都匹配后缀规则 result = bucket_file_extensions_df.bucket_file_extensions.apply( lambda str_list: all(s.endswith(extensions_as_tuple) for s in str_list)) print(result)
逻辑说明
- 前4行的所有元素均能匹配指定规则:
NoExt、json本身属于指定列表,endswith匹配成立log.gz以gz结尾,匹配成立yml、my-file.yaml分别以yml、yaml结尾,匹配成立
因此这些行的all()判断返回True
- 最后一行的
bucket.blah无法匹配任何指定后缀,all()判断返回False,符合预期
内容的提问来源于stack exchange,提问作者Ke Liang
相关产品推荐
相关产品推荐

