使用df.isin过滤DataFrame返回空列表的原因排查
排查筛选返回空DataFrame的原因
以下是几种最可能导致匹配失败的原因及对应的验证、解决方法:
1. 数据类型不匹配
- 核心问题:你生成的
prod_data列表元素是字符串类型(如'3914'),但爬取得到的DataFrame中Certificate_Number列可能是整数类型,类型不一致会导致isin完全匹配失败。 - 验证方式:在
get_cmvp_data函数中添加代码查看类型:print("Certificate_Number列类型:", df['Certificate_Number'].dtype) print("prod_data元素类型:", type(prod_data[0])) - 解决方法:统一两边数据类型二选一即可:
# 方案1:把prod_data转为整数列表 prod_data = [int(num) for num in prod_data] # 方案2:把DataFrame列转为字符串 df['Certificate_Number'] = df['Certificate_Number'].astype(str)
2. 隐藏特殊字符/空格干扰
- 核心问题:从Excel读取的编号可能带有全角空格、零宽空格等不可见字符,或网页爬取的证书编号前后有空格,导致表面相同的字符串实际不相等。
- 验证方式:用
repr()打印原始内容,查看隐藏字符:# 检查prod_data的原始内容 for num in prod_data[:5]: print(repr(num)) # 检查DataFrame列的原始内容 print(df['Certificate_Number'].apply(repr).head()) - 解决方法:对两边数据做彻底清洗:
# 清洗prod_data prod_data = [str(num).strip().replace('\u200b', '') for num in prod_data] # 清洗DataFrame列 df['Certificate_Number'] = df['Certificate_Number'].astype(str).str.strip().replace('\u200b', '', regex=True)
3. 网页表格解析异常
- 核心问题:爬取的网页表格中,
Certificate_Number列可能带有前缀(如CMVP-3914),或解析时出现多行合并、格式错乱,导致实际内容和你预期的纯数字不符。 - 验证方式:直接打印列的前10条数据,确认格式:
print(df['Certificate_Number'].head(10)) - 解决方法:如果有前缀,提取纯数字部分:
df['Certificate_Number'] = df['Certificate_Number'].str.extract(r'(\d+)').astype(str)
4. Excel读取的格式问题
- 核心问题:读取Excel时,
header=4可能导致列名识别错误,或CMVP #列被读取为浮点数(如3914.0),转字符串后带有.0后缀,导致匹配失败。 - 验证方式:打印Excel读取后的中间结果:
print(drop_na['CMVP #'].head()) print(rmv_excess_chars[:5]) - 解决方法:读取时指定列类型,或清洗时去掉小数部分:
# 方案1:读取Excel时指定列类型为字符串 prod_cmvp_data = pd.read_excel('_Request ID__Client Cryptographic Module List Template.xlsx', header=4, dtype={'CMVP #': str}) # 方案2:清洗时去掉小数后缀 rmv_excess_chars = [str(item).strip('# ').split('.')[0] for item in to_list]
内容的提问来源于stack exchange,提问作者Mitchell Privett
相关产品推荐
相关产品推荐

